谈原型链之前先说说关键字new
var obj = new object();
这是一句简单的利用构造器创建一个对象,但是其中经过了三个步骤:
- var obj = {};创建一个空对象obj
- obj. _ proto_ = object.prototype;将obj的_ proto_属性指向object的 prototype成员对象,由此建立了原型链:
obj—>object.prototype—>Object.prototype—>null - object.call(obj);初始化obj即给obj赋值
这里解释一下 _ proto_ :
每一个对象都有一个 _ proto_ 属性,它的 _ proto_ 又会有一个 _ proto_ ,它的 _ proto_ 的 _ proto_ 也有 _ proto_ ,以此类推到null。也就是说当寻找object的某个属性或方法时,如果本身没有就在它的 _ proto_ 里找,如果也没有就在它的 _ proto_ 的 _ proto_ 里找,直到找到最后,这就是原型链的思想。然而 _ proto_ 并不能对外公开,譬如这样:
function object () {
this.name = 'lulu';
this.age = 21;
}
object.prototype = {
getInfo : function(){
return 'name:' + this.name + 'age:' + this.age;
}
};
var obj = new object();
console.log(obj);
输出结果是:
然而输出 console.log(obj._ proto_);却是undefined,也就说明了_ proto_是一个私有属性的事实。
再来一个复杂一点的代码:
var Person = function () { };
Person.prototype.Say = function () {
alert("Person say");
}
Person.prototype.Salary = 50000;
var Programmer = function () { };
Programmer.prototype = new Person();
Programmer.prototype.WriteCode = function () {
alert("programmer writes code");
};
Programmer.prototype.Salary = 500;
var p = new Programmer();
p.Say();
p.WriteCode();
alert(p.Salary);
这里就很好理解了,原型链是这个样子的:
p—>Programmer—>Person—>Object—>null
现在说说new和Object.create()吧
new Object()是一种通过构造函数来创建对象的方式,看看Object.create()的本质吧
if (!Object.create) {
Object.create = function (o) {
function F() {} //定义了一个隐式的构造函数
F.prototype = o;
return new F(); //其实还是通过new来实现的
};
}