在JavaScript中处理继承时的isPrototypeOf()用法

时间:2016-04-20 05:51:33

标签: javascript inheritance prototype

//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?,但我并不了解它在我的用例中是如何应用的。

2 个答案:

答案 0 :(得分:2)

  1. isPrototypeOf检查一个对象是否在另一个对象的原型链中,所以它确实是多层次的
  2. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf

    1. 它们可用于相同目的。您可以执行square instanceof SquareSquare.prototype.isPrototypeOf(square)但正如您所看到的,instanceof具有将对象与其构造函数匹配的特定目的,其中isPrototypeOf可以更广泛地用于检查是否有任何对象另一个原型链。
    2. 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
}