Javascript 使用prototype/quot;新";

Javascript 使用prototype/quot;新";,javascript,oop,Javascript,Oop,嗨,我是Javascript OO新手,想了解更多关于继承的知识。希望您能提供一些建议 我看到了这个很棒的帖子: 它讨论了类是如何继承的,正如我在其他网站中看到的,例如: function man(x) { this.x = x; this.y = 2; } man.prototype.name = "man"; man.prototype.two = function() { this.y = "two"; } function shawn() { man.a

嗨,我是Javascript OO新手,想了解更多关于继承的知识。希望您能提供一些建议

我看到了这个很棒的帖子:

它讨论了类是如何继承的,正如我在其他网站中看到的,例如:

function man(x) {
    this.x = x;
    this.y = 2;
}
man.prototype.name = "man";
man.prototype.two = function() {
    this.y = "two";
}
function shawn() {
    man.apply(this, arguments);
};
shawn.prototype = new man;
上面的帖子声称,为了在继承时不调用“man”的构造函数,可以使用这样的助手:

function subclassOf(base) {
    _subclassOf.prototype= base.prototype;
    return new _subclassOf();
}
function _subclassOf() {};
shawn.prototype = subclassOf(man);
虽然我理解它的意图,但我不明白为什么我们不能打电话

shawn.prototype = man.prototype;

我看它的工作原理完全一样。还是我遗漏了什么?提前谢谢

依我之见,例子比语言好。以下所有示例都使用您的代码,并添加了一些内容

第一个例子将证明使用
shawn.prototype=newman调用构造函数两次

功能人员(h、w){
SendMessage(“人是由身高“+h+”和体重“+w”创造的);
这个高度=h;
该重量=w;
}
man.prototype.name=“man”;
man.prototype.double=函数(){
该高度*=2;
这个。重量*=2;
}
函数shawn(){
应用(这个,论点);
};
函数SendMessage(msg){
document.getElementById(“控制台”).innerHTML+=msg+“
”; } window.onload=函数(){ 肖恩:原型=新人; var p=新肖恩(180,90); SendMessage(“Shawn高度:+p.height”); }

除了@Shadow的优秀答案外,你还可以将
shawn.prototype=man.prototype
理解为“shawn和man是一样的”
,而不是“shawn是个男人”

将共享原型(修改一个将修改另一个)

shawn.prototype = new man;
shawn.prototype
设置为新创建的对象,该对象继承自
man.prototype
,因此对它的更改不会传播到
man
实例

但是,使用
new
意味着将执行构造函数
man()
,这可能会产生不希望的副作用

最好通过手动克隆原型

shawn.prototype = Object.create(man.prototype);
如果可用,或a(其工作方式与您的
子类
相同)


否则。

哇,非常感谢你的回答!这个解释解释得很好,现在一切都完全有道理了。p、 我喜欢婚姻的功能。:)@mikkol当然,我很乐意。。希望我的婚姻假设不适用于你为了便于参考,我已经内联了所有的代码示例:)是的,我没有意识到它们将“链接”在一起,以便同时进行修改。谢谢
shawn.prototype = Object.create(man.prototype);
shawn.prototype = clone(man.prototype);