原型模式,每个创建的对象都有一个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);
}

LoveJing526
49 声望0 粉丝

每天学点新知识充实自己,每天阅读些文字净化心灵。