Javascript 这两种继承方式有区别吗?

Javascript 这两种继承方式有区别吗?,javascript,oop,inheritance,prototype,Javascript,Oop,Inheritance,Prototype,问题是,当我们想要建立继承时,我看不出这两种方法之间有什么区别: Child.prototype = Object.create( Father.prototype ); Child.prototype.constructor = Child; 以及: 第一个选项允许我们获取父亲共享的所有属性和方法,但在过程中覆盖子构造函数。这就是我们需要再次将子构造函数设置回Child的原因。第二个方法执行相同的操作,但没有覆盖。那么,为什么人们/导游不使用第二种选择呢?我做错什么了吗 这是一个完整的示例:

问题是,当我们想要建立继承时,我看不出这两种方法之间有什么区别:

Child.prototype = Object.create( Father.prototype );
Child.prototype.constructor = Child;
以及:

第一个选项允许我们获取父亲共享的所有属性和方法,但在过程中覆盖子构造函数。这就是我们需要再次将子构造函数设置回Child的原因。第二个方法执行相同的操作,但没有覆盖。那么,为什么人们/导游不使用第二种选择呢?我做错什么了吗

这是一个完整的示例:

function Father( name ) {
  this.name = name;
}

Father.prototype.getName = function() {
  console.log( this.name );
}

function Child( name, lastName ) {
  Father.call( this, name );
  this.lastName = lastName;
}

Child.prototype.__proto__ = Father.prototype;

//Child.prototype = Object.create( Father.prototype );
//Child.prototype.constructor = Child;

var c = new Child( 'Will' , 'Travolta');
c.getName();
我看不出这两种方法之间有什么区别

结果确实没有差别(除了一些次要细节,如
.constructor
属性的可枚举性)

那么,为什么人们/导游不使用第二种选择呢

因为,while可以在任何地方工作。它是ES5标准化的,可以很容易地在较旧的环境中进行多填充

由于ES6,您也可以使用,但由于ES6,您只需编写
类Child扩展父{…}

我看不出这两种方法之间有什么区别

结果确实没有差别(除了一些次要细节,如
.constructor
属性的可枚举性)

那么,为什么人们/导游不使用第二种选择呢

因为,while可以在任何地方工作。它是ES5标准化的,可以很容易地在较旧的环境中进行多填充


从ES6开始,您也可以使用,但从ES6开始,您只需编写
类子级扩展父级{…}

如注释中所述,
\uuuuu proto\uuuu
目前被弃用,而支持
对象.getPrototypeOf()
对象.setPrototypeOf()
。除此之外,关于完全覆盖构造函数原型与单独向其添加/删除属性/方法的正确性,还有很多公开讨论。这两种做法都被广泛接受/实施,事实上,销毁
prototype.constructor
(或对象的所有原型)在大多数情况下都不会造成伤害。我更喜欢个人操作,因为它应该是未来的证明。请注意,编写
Child.prototype=Object.create(Father.prototype)
您正在销毁原始原型。

如注释中所述,
\uuuuuuuuuuuuu
目前被弃用,取而代之的是
Object.getPrototypeOf()
Object.setPrototypeOf()
。除此之外,关于完全覆盖构造函数原型与单独向其添加/删除属性/方法的正确性,还有很多公开讨论。这两种做法都被广泛接受/实施,事实上,销毁
prototype.constructor
(或对象的所有原型)在大多数情况下都不会造成伤害。我更喜欢个人操作,因为它应该是未来的证明。请注意,编写
Child.prototype=Object.create(Father.prototype)
您正在破坏原始原型。

好吧,首先,直到ES5才将
\uuuuuuuuuuuuu
标准化。所以以前的任何东西都不应该推荐它。除了
\uuuuuu proto\uuuuuu
被弃用之外,结果几乎没有什么不同。@VLAZ
\uuuuuu proto\uuuu
在ES5中没有标准化,
对象.getPrototypeOf
是。ES6带来了
Object.setPrototypeOf
和web兼容性规则(包括
\uuuu proto\uuuu
)。@Bergi yeah,对不起。我指的是网络兼容性。我真的不应该说“标准化”。不管怎样,是的-我不知道你为什么说我们需要重写构造函数回到原始的,OP-。好吧,首先,直到ES5才标准化了
。所以以前的任何东西都不应该推荐它。除了
\uuuuuu proto\uuuuuu
被弃用之外,结果几乎没有什么不同。@VLAZ
\uuuuuu proto\uuuu
在ES5中没有标准化,
对象.getPrototypeOf
是。ES6带来了
Object.setPrototypeOf
和web兼容性规则(包括
\uuuu proto\uuuu
)。@Bergi yeah,对不起。我指的是网络兼容性。我真的不应该说“标准化”。无论如何,是的-我不知道你为什么说我们需要重写构造函数回到原来的,OP-。
function Father( name ) {
  this.name = name;
}

Father.prototype.getName = function() {
  console.log( this.name );
}

function Child( name, lastName ) {
  Father.call( this, name );
  this.lastName = lastName;
}

Child.prototype.__proto__ = Father.prototype;

//Child.prototype = Object.create( Father.prototype );
//Child.prototype.constructor = Child;

var c = new Child( 'Will' , 'Travolta');
c.getName();