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():