OOP继承和对象实例

时间:2015-01-27 10:30:22

标签: javascript oop inheritance

我用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?

3 个答案:

答案 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控制台看到这个图像,我将讨论

enter image description here

在您的代码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。