- 原型式继承是由道格拉斯发明的一种继承方法,该方法没有严格意义上的构造函数。借助原型可以基于已有的对象来创建对象。他给出了函数:
function object(obj) {
//定义了一个临时构造函数
function F() {}
//将这个临时构造函数的原型指向了传入进来的对象。
F.prototype = obj;
//返回这个构造函数的一个实例。该实例拥有obj的所有属性和方法。
//因为该实例的原型是obj对象。
return new F();
}
new F();的过程相当于如下,假设实例对象为f
//相当于将构造函数的原型对象赋给实例对象p的属性__proto__
var f.__proto__ = Object.setPrototypeOf({},F.prototype);
//构造函数在实例f中执行
F.call(f);
所以通过该函数object(),就能返回一个实例,该实例的原型指向了另一个对象。因此就拥有了另一个对象所拥有的全部属性和方法。
var obj = {
name: "zhenglijing",
sayName: function() {
alert(this.name);
}
};
function object(obj) {
function F() {}
F.prototype = obj;
return new F();
}
var o1 = object(obj);
o1.name;
o1.sayName();
2、后来,ECMAScript5规范了称之为原型式继承,即使用Object.create()方法。
接受两个参数:第一个是作为新对象的原型对象,第二个是可选参数,是作为新对象定义额外属性的对象。接收一个参数时和object()方法一致。
在没有必要使用创建构造函数,而只想让一个对象与另一个对象保持类似的情况下,原型式继承就可以了。不过,该模式下,包含引用类型的属性始终都会共享相应的值。
想要让A对象和B对象一致,难道不可以这样吗?
var A = B;//把B的引用值赋给A,那么A不就和B类似了吗?
但是情况是,A要新添删除属性和方法时,B也将会新添删除相应的属性和方法。因为A和B是指向的同一个对象。