更改javascript对象的2种方法';s原型,什么';他们之间有什么区别?
我从stackoverflow中阅读了这段代码,它指出了如何在javascript中实现“继承”更改javascript对象的2种方法';s原型,什么';他们之间有什么区别?,javascript,object,inheritance,prototype,Javascript,Object,Inheritance,Prototype,我从stackoverflow中阅读了这段代码,它指出了如何在javascript中实现“继承” var Base=function(){this.a='abc'}; var Sub = function () {}; Sub.prototype = new Base(); // note: this pattern is deprecated! //Because we used 'new', the [[prototype]] property of Sub.prototype //is n
var Base=function(){this.a='abc'};
var Sub = function () {};
Sub.prototype = new Base(); // note: this pattern is deprecated!
//Because we used 'new', the [[prototype]] property of Sub.prototype
//is now set to the object value of Base.prototype.
//The modern way to do this is with Object.create(), which was added in ECMAScript 5:
Sub.prototype = Object.create(Base.prototype);
我想知道,如果
Sub.prototype=新基础()
不推荐使用新方法吗
Object.create(Base.prototype)
引入所创建对象的任何内部差异?是否存在任何内部属性差异、行为差异,以便我应该使用新的方式,并尝试将旧代码转换为新代码
谢谢。我能指出的唯一区别是,当您使用
new
时,Sub
的原型是基本的实例。这意味着所有属性都将在子类上可用(不仅仅是原型方法)
因此在您的示例中Sub.prototype=Object.create(Base.prototype)代码>不继承任何内容。而Sub.prototype=new Base()
继承了a
属性Imho做相关事情的现代方式和相关关键字
您建议的两个选项产生不同的结果。看见您缺少对超级构造函数的调用以及将prototype.constructor
重新分配到正确的值(在另一种情况下也缺少该值)
使用Object.create
执行继承时,如链接中所述,与分配new Base()
相比,可以找到以下属性:
function Base(){this.baseProp=“baseProp”;}
函数Sub(){this.subop=“subop”;}
Sub.prototype=新基础();
Sub.prototype.constructor=Sub;
设obj=newsub();
控制台日志(“obj.baseProp:+obj.baseProp”);
log(“自身有baseProp:+obj.hasOwnProperty(“baseProp”))代码>最大的区别在于Object.create不会调用基函数。它只是将该函数设置为原型,并设置原型链。