我用JavaScript编写了继承和OOPS。我创造了一个' A'对象和' B'对象并继承了' B'的所有属性。到' A'。
当我使用' instanceof'检查新创建的对象实例时,我得到两个对象都是真的。
但我使用' B'创建了对象。仅限构造函数。
function A(){
this.a = "test1",
this.b = "test2"
}
function B(){
this.c = "test3",
this.d = "test4"
}
B.prototype = new A();
var userObj = new B();
console.log(userObj instanceof B); // true
console.log(userObj instanceof A); // true, How this can be true?
答案 0 :(得分:4)
在JavaScript中,继承是基于原型的。这意味着没有课程。相反,对象继承自另一个对象。
你在这里做的是,对象B继承自对象A,因为:
B.prototype = new A();
所以,现在,userObj
(对象B的实例)当然成为对象A的实例,(这就是继承的全部内容,对吗?)
这就是原因
console.log(userObj instanceof B); // true
console.log(userObj instanceof A); // Also true?
答案 1 :(得分:1)
Prototype对象有一个名为constructor的内置属性。首先从chorme控制台看到这个图像,我将讨论
在您的代码B.prototype = new A();
=>中,此语句将B的原型设置为A.So B的原型对象的实例将其构造函数属性分配给A();
console.log(userObj.constructor // it will show A.But it is not true
记住它不是userObj的构造函数。你得到的构造函数来自原型obj。
console.log(userObj instanceof A); //真的,这是怎么回事?
由于userObj是B.的实例,而B继承自A.所以userObj也是A.的实例。但是你可以使用
操作构造函数属性设置为B.B.prototype.constructor=B;
答案 2 :(得分:0)
console.log(userObj instanceof A);
你肯定会得到true
。这符合JavaScript标准。
当您创建B
的对象并继承A
的所有属性时,该对象包含指向__proto__
的链接A's Prototype
。
因此instanceof
会在对象A's
的原型链中找到B
构造函数。
这就是为什么它返回true。