首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript多级继承与isPrototypeOf

JavaScript多级继承与isPrototypeOf
EN

Stack Overflow用户
提问于 2015-05-21 06:19:59
回答 1查看 196关注 0票数 0

我有一个在JavaScript中实现的多层次继承,如下所示

代码语言:javascript
运行
复制
function MovingObject(){

}

function Vehicle(){

}
Vehicle.prototype = Object.create(MovingObject);

function Car(){

}
Car.prototype = Object.create(Vehicle);

var c = new Car();

汽车是汽车的孩子,它反过来又是MovingObject的孩子,所以我期望汽车是MovingObject的间接子代。

下面的语句返回真实的指示车是车辆的直接子级

代码语言:javascript
运行
复制
Vehicle.isPrototypeOf(c);

但是,下面的语句不返回true

代码语言:javascript
运行
复制
MovingObject.isPrototypeOf(c);

知道为什么不返回真,以及如何让它返回真正的

EN

回答 1

Stack Overflow用户

发布于 2015-05-21 06:25:37

这是关于JavaScript的一个常见问题。

MovingObjectVehicle构造函数,但它们不是原型。

也就是说,您应该使用Object.create(ConstructorFunction.prototype)来派生,而不是只使用ConstructorFunction

在JavaScript中,即使是一个函数也是一个对象,这就是当您提供构造函数时Object.create(...)工作的原因。生成的对象将构造函数对象作为原型。

实际上,您可以使用Object.create(ConstructorFunction.prototype)方法,也可以使用new实现相同的目标。

代码语言:javascript
运行
复制
Vehicle.prototype = new MovingObject();

new方法的主要问题是,您正在使用构造函数创建一个新对象,并且可能正在向原型中添加不必要的数据和行为:

代码语言:javascript
运行
复制
function MovingObject() {
  this.x = 11;
}

function Vehicle() {}
Vehicle.prototype = new MovingObject();

var instance = Object.create(Vehicle.prototype);

// What? instance has "x" property!!
document.getElementById("result").textContent = instance.x;
代码语言:javascript
运行
复制
<div id="result"></div>

更新

OP在一些评论中说:

这是否意味着我们不能建立一个真正的is-汽车和MovingObject之间的关系?如果是,我们如何使用代码进行测试?意思是,我只想执行一些代码,只有汽车是-一个移动的对象。我怎样才能完成这个测试?

请检查并执行以下代码片段,以使其更加清晰:

代码语言:javascript
运行
复制
function A() {}

function B() {}
B.prototype = Object.create(A.prototype);

function C() {}
C.prototype = Object.create(B.prototype);

var instanceOfB = Object.create(B.prototype);
var instanceOfC = Object.create(C.prototype);

var result1 = A.prototype.isPrototypeOf(instanceOfC);
var result2 = B.prototype.isPrototypeOf(instanceOfC);
var result3 = A.prototype.isPrototypeOf(instanceOfB);

document.getElementById("result1").textContent = result1;
document.getElementById("result2").textContent = result2;
document.getElementById("result3").textContent = result3;
代码语言:javascript
运行
复制
<h2>A is prototype of instanceOfC?</h2>
<div id="result1"></div>
<h2>B is prototype of instanceOfC?</h2>
<div id="result2"></div>
<h2>A is prototype of instanceOfB?</h2>
<div id="result3"></div>

更新2

正如@RobertRossmann对这个答案的注释一样,可以使用instanceof操作符实现相同的代码片段,该操作符的附加值是有效的,可以检查实例是否具有提供构造函数的原型:

代码语言:javascript
运行
复制
function A() {}

function B() {}
B.prototype = Object.create(A.prototype);

function C() {}
C.prototype = Object.create(B.prototype);

var instanceOfB = Object.create(B.prototype);
var instanceOfC = Object.create(C.prototype);

var result1 = instanceOfC instanceof B;
var result2 = instanceOfC instanceof C;
var result3 = instanceOfB instanceof A;
var result4 = instanceOfC instanceof A;

document.getElementById("result1").textContent = result1;
document.getElementById("result2").textContent = result2;
document.getElementById("result3").textContent = result3;
document.getElementById("result4").textContent = result4;
代码语言:javascript
运行
复制
<div id="result1"></div>
<div id="result2"></div>
<div id="result3"></div>
<div id="result4"></div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30365958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档