我创建了两个函数A和B.制作A作为B. jsfiddle
的原型function A(){
}
function B(){
this.name ="Class B";
}
B.prototype = A;
var b = new B();
alert(b.name); // expected Class B got A
我知道我应该使用B.prototype = new A();
是否有预期的上述行为? 在上面的场景中是否可以获得“B级”而不是“A”?
注意:我在上面使用,因为A有一些与A.text = "Text"
A.text1 = "Text2"
相关联的属性,我希望这些属性可用于B.所以B.prototype == A.prototype.
不能使用。
答案 0 :(得分:2)
请查看可能的重复What is the reason to use the 'new' keyword at Derived.prototype = new Base以及this answer,了解为什么javascript中没有“类”。
是的,行为是预期的。 B.prototype
实例继承的对象b
是函数对象A
。因此,它确实继承了name
property,即字符串"A"
。
并且,此属性是不可变的(其属性描述符为{configurable: false, enumerable: false, value: "B", writable: false}
),因此当您尝试为b.name
分配新值时,this will check的[[CanPut]]
将返回false
- 没有任何反应。在严格模式下,将抛出Invalid assignment in strict mode
TypeError(demo)。
您只能使用Object.defineProperty
覆盖它。
@Edit:我不确定为什么你想要B
继承的那些属性。它们是A
构造函数的“静态属性”,它们应该保留在那里。目前没有办法让函数继承Function.prototype
以外的任何东西,所以要么你复制它们要么你不使用它们。告诉我们您需要什么,我们可以找到解决方案。
更改函数(和一般对象)的prototype
属性不会使它们从其他任何东西继承。函数的prototype
属性指向新创建的(构造的)实例将从其继承的对象。
答案 1 :(得分:0)
如果您希望B
从A
“继承”,请写:
B.prototype = Object.create( A.prototype );