Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改javascript对象的2种方法';s原型,什么';他们之间有什么区别?_Javascript_Object_Inheritance_Prototype - Fatal编程技术网

更改javascript对象的2种方法';s原型,什么';他们之间有什么区别?

更改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

我从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 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不会调用基函数。它只是将该函数设置为原型,并设置原型链。