//I have this base Rectangle constructor function
function Rectangle (length, width){
this.length = length;
this.width = width;
}
Rectangle.prototype.getArea = function (){
return this.length * this.width;
};
//Creating Square constructor function that will inherit from Rectangle...
function Square(size){
this.length = size;
this.width = size;
}
Square.prototype = new Rectangle();
Square.prototype.constructor = Square;
//creating rectangle and square instances
var rect = new Rectangle(5, 10);
var square = new Square(6);
console.log(rect.getArea()); //50
console.log(square.getArea()); //36
console.log(Rectangle.prototype.isPrototypeOf(Square.prototype)); //true
console.log(Rectangle.prototype.isPrototypeOf(rect)); //true
console.log(Square.prototype.isPrototypeOf(square)); //true
我的问题是当我执行以下console.log()
时,我预计会打印false
。但是,我得到true
。
console.log(Rectangle.prototype.isPrototypeOf(square)); //true
1)这是否意味着isPrototypeOf
进入多个级别?
2)如果isPrototypeOf
达到多个级别,那么使用isPrototypeOf
代替使用instanceof
有什么意义呢?
我已经阅读了这个Why do we need the isPrototypeOf at all?,但我并不了解它在我的用例中是如何应用的。
答案 0 :(得分:2)
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf
square instanceof Square
或Square.prototype.isPrototypeOf(square)
但正如您所看到的,instanceof
具有将对象与其构造函数匹配的特定目的,其中isPrototypeOf可以更广泛地用于检查是否有任何对象另一个原型链。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
答案 1 :(得分:1)
isPrototypeOf()
方法测试另一个对象的原型链中的对象
您的代码中的
console.log(Rectangle.prototype.isPrototypeOf(square)); // true
它打印为true,因为 Square 方法位于链中 getArea 方法和 getArea 是Rectangle的原型方法
Rectangle.prototype.getArea = function (){
return this.length * this.width;
};
例如根据Mozilla Docs
function Fee() {
// ...
}
function Fi() {
// ...
}
Fi.prototype = new Fee();
function Fo() {
// ...
}
Fo.prototype = new Fi();
function Fum() {
// ...
}
Fum.prototype = new Fo()
稍后在路上,如果您实例化Fum并需要检查是否 Fi的原型存在于Fum原型链中,你可以做到 这样:的
var fum = new Fum();
// ...
if (Fi.prototype.isPrototypeOf(fum)) {
// do something safe
}