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();