我们应该使用哪些javascript继承变体以及为什么
Which variants of javascript inheritance we should use and why?
我不明白我们应该使用哪些继承变体。我甚至不知道他们之间是否有区别
我有一个简单的JavaScript继承示例:
function MyObject(a){
this.a = a;
}
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.a + " " + myObj.b);
结果将是"12"。
但这一行:
MyObjectChild.prototype = Object.create(MyObject.prototype);
我们可以用10种不同的方式写作:
MyObjectChild.prototype = new MyObject();
MyObjectChild.prototype = MyObject.prototype;
MyObjectChild.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype = Object.create(MyObject);
MyObjectChild.prototype = Object.create(MyObject.prototype);
MyObjectChild.prototype.prototype = new MyObject();
MyObjectChild.prototype.prototype = MyObject.prototype;
MyObjectChild.prototype.prototype = MyObject.prototype.prototype;
MyObjectChild.prototype.prototype = Object.create(MyObject);
MyObjectChild.prototype.prototype = Object.create(MyObject.prototype);
所有这些都会起作用!有人能解释一下我们应该使用哪些变体,不应该使用哪个变体吗?
您可以用无数种不同的方式编写它,因为在这种情况下它什么都不做。
尝试您的代码CCD_ 1,它仍然有效。
在MyObject.call(this, a);
行,您将MyObject作为一个函数进行调用,为其提供与MyObjectChild
构造函数中相同的this
引用。因此,在创建myObj
对象时,将a
和b
的值直接添加到MyObjectChild
对象中。
回答你的问题:你应该两者都不用。
然而,在你的例子中,你可以达到这样的预期效果。。。
function MyObject(a){
this.a = a;
}
MyObject.prototype.foo = "ta da";
function MyObjectChild(a, b){
MyObject.call(this, a);
this.b = b;
}
MyObjectChild.prototype = Object.create(MyObject.prototype);
var myObj = new MyObjectChild(1, 2);
console.log(myObj.foo); // ta da
这样,使用这些构造函数创建的所有实例(如myObj
)都将继承MyObjectChild.prototype = Object.create(MyObject.prototype);
0的属性。
编辑:
最初建议使用CCD_ 11。这意味着所有实例都从同一个原型对象继承属性。
感谢下面的Bergi指出这可能不是您想要的,因为向MyObjectChild
的原型添加属性将由MyObject
继承。
Object.create(MyObject.prototype)
创建一个新对象(您可以向其中添加只有MyObjectChild
实例继承的属性),同时仍然继承MyObject
原型的属性。
相关文章:
- 为什么不't htmlCollection从数组继承
- 为什么函数对象的实例没有继承函数原型属性
- JavaScript继承:为什么从实例复制
- 为什么可以't我的指令从其父作用域继承函数
- 为什么使用CoffeeScript类继承时主干模型不能正常工作
- 为什么javascript中的原型对于继承是必要的
- 为什么 JavaScript 继承是这样工作的
- 在 JavaScript 中通过 B.prototype = new A() 继承,为什么需要设置 B.prototyp
- 为什么允许通过原型继承访问另一个闭包范围内的私有变量
- 为什么在我的 jsperf tsts 中,更长的继承链需要更长的时间
- 为什么 Object.create 在 JavaScript 中的原型继承方面没有做我所期望的
- 为什么要在 Node.js 中使用 util.inherits 和 .call 进行继承
- 为什么并非所有属性都从内置对象(Javascript)继承/访问
- JavaScript继承为什么在某些属性中被遗漏了
- 为什么 Object 对象中的某些属性不会在子对象中继承
- JavaScript:为什么getOwnPropertyDescriptor()包含自定义的继承属性
- 我们应该使用哪些javascript继承变体以及为什么
- JavaScript 继承为什么我需要同时调用 fun.call 和 prototype = new Obj( )
- 为什么在寄生组合继承中需要复制原型
- 原型继承为什么子对象不从父对象继承方法