核心提示:原型式继承是由道格拉斯发明的一种继承方法,该方法没有严格意义上的构造函数。借助原型可以基于已有的对象来创建对象。他给出了函数: function object(obj) { //定义了一个临时构造函数...
原型式继承是由道格拉斯发明的一种继承方法,该方法没有严格意义上的构造函数。借助原型可以基于已有的对象来创建对象。他给出了函数:
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是指向的同一个对象。