在javaScript创建对象一文中提到过:用构造函数创建对象存在一个问题即同一构造函数的不同实例的相同方法是不一样的,所以我们用原型把构造函数中公共的属性和方法提取出来进行封装,达到让所有实例共享的目的。
接下来进一步介绍javaScript原型。
一、javaScript原型机制
1、函数与原型的关系
js中创建一个函数,就会自动创建一个prototype属性,这个属性指向函数的原型对象,并且原型对象会自动获得一个constructor(构造函数)属性,指向该函数。
举例:以前面的原型模式创建对象为例说明
<script type="text/javascript">
function Person(){ }
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
} var lxy=new Person();
lxy.sayName();
var personA=new Person();
personA.sayName();
alert(lxy.sayName()==personA.sayName());//true
</script>
Person对象和Person对象的原型之间的关系如下图1。
aaarticlea/png;base64,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" alt="" />
图1函数、实例与原型的关系(图来着JS高程)
简单一句话就是:Person.prototype.constructor指向Person,可以在浏览器中测试一下。
2、实例与原型的关系
通过构造函数创建一个实例,该实例内部将包含一个属性(指针),指向构造函数的原型对象。
举例:Person构造函数的实例Person1和Person2的[[Prototype]]属性都指向Person的原型。如图1所示。
Note:[[Prototype]]连接是存在于实例和构造函数的原型之间,而不是存在实例与构造函数之间。
关于这个指针,ECMA-262中叫[[Prototype]],没有标准的方式访问[[Prototype]],但Firefox、Safari和Chrome在每个对象上都支持一个属性__protp__,而在其他实现中,这个属性对脚本不可见。
3、原型链
实例有自己的属性和方法,而原型封装了所有实例共享的属性和方法,那这种共享是通过什么方式实现的呢?答案是原型链。
当要访问实例的属性时,解析器会执行一次搜索。首先从实例对象开始,如果在实例中找到了这个属性,则返回该属性的值;重点是如果没有找到的话,则继续搜索[[Prototype]]指针指向的原型对象,在原型对象中查找该属性,如果找到,则返回该属性的值。所以通过这种方式多个实例就能共享保存在原型中的属性和方法。这也是js的原型链。
Note:理解了原型链,很自然就能明白几个问题。
a、给实例添加一个与原型中同名的属性,就会将其屏蔽。因为搜索原型链时在实例中就能找到然后就返回了,根本到不了原型。
b、可以通过实例爬原型链访问原型中的值,但却不能通过实例重写原型中的值。同理。
c、原型的动态性,在原型上新增属性或方法能立即从实例反应出来。
二、原型相关的方法介绍
1、isPrototypeOf()方法
虽然实例的[[Prototype]]属性无法访问的,我们可以通过isPrototypeOf()方法来确认原型和实例之间的关系。这个方法呢是站在原型的角度来检测原型是不是某个实例的原型。A.isPrototypeOf(B),如果A的B的原型返回true,否则返回false。
举例:因为Person的两个实例lxy和personA内部都有一个[[Prototype]]属性指向Person.prototype。所以isPrototypeOf方法会返回true。
<script type="text/javascript">
function Person(){ }
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
} var lxy=new Person();
var personA=new Person();
console.log(Person.prototype.isPrototypeOf(lxy)); //true
console.log(Person.prototype.isPrototypeOf(personA)); //true
</script>
2、Object.getPrototypeOf()方法
这个方法是ECMAScript 5中新增的,返回实例的[[Prototype]]值。
这个方法是非常有用的,因为它是在Object上实现的。所以把任何实例扔给Object,它都能获得实例的原型。
举例
<script type="text/javascript">
function Person(){ }
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
} var lxy=new Person();
console.log(Object.getPrototypeOf(lxy));
console.log(Object.getPrototypeOf(lxy)==Person.prototype); //true
console.log(Object.getPrototypeOf(lxy).age);//
</script>
结果:
3、hasOwnPrototype()方法
这个方法用于检测某个属性是否真正存在于实例中。是返回ture,否则返回false。
就像我们自己有一些资源和技能,但是也可以从爹妈那里得到一些资源和技能,比如看起来你有套别墅,但是你要知道哪些是你真正属于你自己的,哪些是爹妈给你的。
举例:比如我一出生父母就给我个名字lxy,这时候我用hasOwnPrototype()方法检测这个"name"属性是不真是我的,就会返回false。
后来我自己改了个名字starof,再用hasOwnPrototype()方法检测,这时就会返回true。
再后来我不想用这个名字了,我就把它delete掉了,用回了我父母给的名字。这时候再用hasOwnPrototype()方法检测这个"name"属性是不是我自己的,就会返回false。
这个一波三折的故事代码如下:
<script type="text/javascript">
function Person(){ }
Person.prototype.name="lxy"; var lxy=new Person();
console.log(lxy.name);
console.log(lxy.hasOwnProperty("name")); //false
lxy.name="starof";//通过重写屏蔽原型属性name,所以这个name就变成了实例属性
console.log(lxy.name);
console.log(lxy.hasOwnProperty("name")); //true
delete lxy.name;
console.log(lxy.name);
console.log(lxy.hasOwnProperty("name")); //false
</script>
4、in操作符,for-in循环,Object的keys()和getOwnPropertyNames()
in操作符在通过对象能够访问属性时返回true,无论该属性是实例属性还是原型属性。
for-in循环,返回所有能够通过对象访问的,可枚举的属性。即包括实例属性也包括原型属性。
屏蔽了原型中不可枚举的属性的实例属性也会在for-in循环中返回,因为根据规定,所有开发人员定义的属性都是可枚举的——只有在IE8及更早版本中例外。
Object.keys()方法,取得实例上所有可枚举的实例属性。该方法接收一个实例作为参数,返回一个包含所有可枚举属性的字符串数组。
Object.getOwnPropertyNames()方法,获得所有实例属性,无论它是否可枚举。
<script type="text/javascript">
function Person(){ }
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
} var lxy=new Person();
//in
console.log("name" in lxy);//in实例可访问的属性
//for-in
for(var prop in lxy){
console.log(prop);
}//for-in列出所有可访问的,可枚举的属性
//Object.keys
var keys=Object.keys(Person.prototype);
console.log(keys);//Person的原型的所有可枚举属性
var keys=Object.keys(lxy);
console.log(keys);//lxy现在没有实例属性,所以keys为空
lxy.name="lxy";
var keys=Object.keys(lxy);
console.log(keys);
//Object.getOwnPrototypeNames
console.log(Object.getOwnPropertyNames(lxy));//得到所有实例属性
</script>
三、原型语法
第一种:每添加一个属性和方法,都直接在原型上加。
<script type="text/javascript">
function Person(){
}
Person.prototype.name="lxy";
Person.prototype.age=22;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
} var lxy=new Person();
</script>
第二种:对象字面量的方法
<script>
function Person(){
}
Person.prototype={
name:"lxy",
age: 22,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var lxy=new Person();
</script>
第二种语法比较简单,少写几行代码,但是有一点要注意,字面量形式,完全重写了prototype属性,所以constructor不再指向Person,而是Object了。
<script>
function Person(){
}
Person.prototype={
name:"lxy",
age: 22,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var lxy=new Person(); console.log(lxy.constructor==Person);//false
console.log(lxy.constructor==Object);//true </script>
如果constructor很重要,可手动设置为Person,如下。
<script>
function Person(){
}
Person.prototype={
constructor:Person,
name:"lxy",
age: 22,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var lxy=new Person(); console.log(lxy.constructor==Person);//true
console.log(lxy.constructor==Object);//false
</script>
但是这样写会导致constructor的[[Enumerable]]特性被置为true。因为开发人员定义的属性都是可枚举的。
如果是兼容ECMAScript5的JS引擎可使用Object.definePrototype。
<script>
function Person(){
}
Person.prototype={
name:"lxy",
age: 22,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
//重设构造函数,只适用于ECMAScript5兼容的浏览器
Object.defineProperty(Person.prototype,"constructor",{
enumerable:false,
value:Person
}) var lxy=new Person(); console.log(lxy.constructor==Person);//true
console.log(lxy.constructor==Object);//false
</script>
本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4904929.html有问题欢迎与我讨论,共同进步。