原型模式,每個建立的物件都有一個prototype屬性,這個屬性是一個指標,指向一個物件,而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。
------------------------------------------------------------------------
isPertotypeOf()方法來確定物件之前是否存和原型之間的關係;
不能重寫原型中的屬性,如果給物件例項新增的屬性與例項原型中的一個屬性同名,那麼在例項物件中建立的屬性會將原型中的遮蔽掉。可以用delete刪除例項物件中自己新增的屬性;
hasOwnPrototype()可以確定屬性是原型中還是例項物件中,當時例項物件中時,返回的是true;
in操作符,有兩種使用方式,單獨使用和for-in 迴圈中。單獨使用,通過物件能夠訪問屬性時返回true,無論時在原型中還是例項物件中。
下面是依據以上屬性、方法列舉的例項
function Person(){
}
Person.prototype.name="Nike";
Person.prototype.age=29;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
};
function test(){
var person1=new Person();
person1.name="TONY";
//delete person1.name; //刪除建立例項person1時賦值的name
person1.sayName();
var person2=new Person();
person2.sayName();
基於原型模式建立的物件指向同一個物件,person1和person2訪問的都是同一組屬性和同一個sayName()函式,所以返回是true
alert(person1.sayName==person2.sayName);
判斷例項物件是否是Person原型模式,person1是Person的原型模式
alert(window.Person.prototype.isPrototypeOf(person1));
hasOwnProperty()方法判斷屬性是否是例項物件中,如果是,返回true
alert(" person1:"+person1.hasOwnProperty("name")+" person2:"+ person2.hasOwnProperty("name"));
in操作符,name屬性是否在person1物件中,該屬性是例項物件自己賦值的
alert( "name" in person1);
in操作符,name屬性是否在person2物件中,該屬性是原型模式中的
alert("name" in person2);
判斷物件的屬性是否是原型中的,屬性在物件中,而且不是例項物件自己賦值的便會返回true
alert(hasOwnPropertyIn(person1,"name");
alert( hasOwnPropertyIn(person2,"name"));
可以將in操作符與hasOwnProperty()方法一起使用,用於判斷屬性是否是原型中值
function hasOwnPropertyIn(object,sub){
return (!object.hasOwnProperty(sub)) && (sub in object);
}