原型模式

1.什么是原型模式?有什么用?

是一个指向对象的指针。可以让所有对象实例包含它所包含的所有属性和方法,不必在构造函数中定义对象实例的信息。

function Person(){}

Person.prototype.name="jack";
Person.prototype.age=29;
Person.prototype.job="engineer";
Person.prototype.sayName=function(){
    alert(this.name);
};

var person1 = new Person();
person1.sayName();

var person2 = new Person();
person2.sayName();

alert(person1.sayName == person2.sayName);//"jakc"

 2.相关的方法有哪些?

isPrototypeOf()方法:确定对象之间是否存在某种关系

alert(Person.prototype.isPrototyoeOf(person1)); //true

 

Object.getPrototypeOf()方法:返回[[Prototype]]的值。可以方便地获取一个对象的原型

alert(Object.getPrototypeOf(person1) == Person.prototype); //true
alert(Object.getPrototypeOf(person1).name) //"Nicholas"

先从实例中找,如果实例中不存在该属性,那就从原型中去找。

 

hasOwnProperty()方法:检测一个属性是存在于实例中还是原型中。

function Person(){}

Person.prototype.name="Nicholas";
Person.prototype.age=29;
Person.prototype.job="engineer";
Person.prototype.sayName=function(){
    alert(this.name);
};

var person1 = new Person();
var person2 = new Person();

alert(person1.hasOwnProperty("name"));//false


person1.name = "Greg";
alert(person1.name);//G
alert(person1.hasOwnProperty("name"));//true

alert(person2.name);//N
alert(person2.hasOwnProperty("name"));//flase

delete person1.name;
alert(person1.name);//N
alert(person1.hasOwnProperty("name"));//false

只有当person1重写name属性后才会返回true,因为只有这时候name才是一个实例属性,而非原型属性。

 

hasPrototypePrototype(): alert(hasPrototypeProperty(person,"name")); 

 

Object.keys()方法:

function Person(){}

Person.prototype.name="Nicholas";
Person.prototype.age=29;
Person.prototype.job="engineer";
Person.prototype.sayName=function(){
    alert(this.name);
};

var keys = Object.keys(Person.prototype);
alert(keys);//"name,age,job,sayName"

var p1 = new Person();
p1.name = "Rob";
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys); //"name,age"

接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组(按顺序)。

Object.getOwnPropertyName()方法:

var keys = Object.getOwnPropertyNames(Person.prototype);
alert(keys);  //constructor,name,age,job,sayName

Object.keys()和Object.getOwnPropertyNames()方法都可以用来替代for-in循环

 

Object.defineProperty():

posted @ 2017-04-21 20:35  SingSingaSong  阅读(226)  评论(0编辑  收藏  举报