1.在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性包含一个
指向prototype属性所在函数的指针。
2.ES5增加的一个新方法 返回对象的原型 isPrototypeOf()
3.可以通过对象实例访问保存在原型的值,但是不能通过对象实例重写原型的值。如果
在实例中添加一个属性,该属性与实例原型中的一个属性同名,那在实例中创建的该属
性,就会屏蔽原型中的这个属性。虽然是屏蔽了,但是不会修改原型中的这个属性值,
可以使用delete,把实例中的这个属性删除。从而继续访问原型中的这个属性。
4.使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中
。这个方法是从Object中继承来的,只在给定属性存在于对象实例中,才会返回true.
function Person(){}
Person.prototype.name="Nicholas";
Person.prototype.age=29;
Person.prototype.job="Software 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); //"Greg"----来自实例
alert(person1.hasOwnProperty("name")); //true
alert(person2.name); //"Nicholas" 来自原型
alert(person2.hasOwnProperty("name")) //false
delete person1.name;
alert(person1.name); //"Nicholas" 来自原型
alert(person1.hasOwnProperty("name")) //false
5.更简单的原型语法
function(){}
Person.prototype={
constructor:Person,
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
}
6.实例中的指针指向原型,而不是指向构造函数
function Person(){}
var friend=new Person();
Person.prototype={
constructor:Person,
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
}
friend.sayName();//error
这段代码发生了错误。首先创建了Person的一个实例,然后写了一个构造函数。最后写
了原型对象。在中间写个构造函数,就相当于重写了原型对象,而实例中的指针指向原
型,不是构造函数。构造函数中没有name属性。所以导致报错。
7.组合使用构造函数和原型模式。。就是构造函数模式用于定义实例属性,而原型模式
用于定义方法和共享的属性。。这样,每个实例都会有自己的一份实例属性的副本,但
同时又共享着对方法的引用。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friend=["Shelby","Court"];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",27,"Doctor");
person1.friend.push("Van");
alert(person1.friend); //"Shelby,Court,Van"
alert(person2.friend); //"Shelby,Court"
alert(person1.friend===person2.friend); //false
alert(person1.sayName===person2.sayName); //true