2012-11-11 49 views
0

這是我的小程序。當我在調試模式下檢查rec的值時,對象是Base {x = 0,y = 0,w = 10,更多...}。它應該是矩形嗎?另外constructor.prototype是Base。爲什麼不塑造?爲什麼對象和constructor.prototype在JavaScript中設置爲Base?

function Base() { 
    } 

    function Shape(x, y) { 
     this.x = x; 
     this.y = y; 
    } 

    Shape.prototype = new Base(); 
    Shape.prototype.move = function(x, y) { 
     this.x += x; 
     this.y += y; 
     console.log("x = " + this.x + " y = " + this.y); 
    }; 

    function Rectangle(x, y, w, h) { 
     Shape.call(this, x, y); 
     this.w = w; 
     this.h = h; 
    } 

    Rectangle.prototype = new Shape(); 
    Rectangle.prototype.area = function() { 
     return this.w * this.h; 
    }; 
    var rec = new Rectangle(0, 0, 10, 10); 
    console.log(instanceOf(rec, Rectangle)); 

    function instanceOf(object, constructor) { 
     while (object != null) { 
      if (object == constructor.prototype) 
       return true; 
      if (typeof object == 'xml') { 
       return constructor.prototype == XML.prototype; 
      } 
      object = object.__proto__; 
     } 
     return false; 
    } 
+0

可能是因爲'Rectangle.prototype.constructor'是'Base'。 –

+0

_Also的constructor.prototype是Base._你必須像'Rectangle.prototype.constructor = Rectangle'重定向構造函數' – elclanrs

+0

注意,對於本地對象,'typeof object =='xml''永遠不會是true。 – RobG

回答

0

看看Why [not] to use the new keyword here?。您可能不會使用它並創建它的一個新實例,而只是從Base.prototype繼承而來。

另外constructor.prototype是Base。爲什麼不塑造?

我不知道這constructor你指的是在這裏:

  • 所有對象的constructor屬性爲Base,因爲他們都繼承了這個原型來自Base.prototype對象。設置繼承鏈後,您沒有覆蓋它。這不是真的必要,而是很好的風格:Shape.prototype.constructor = ShapeRectangle.prototype.constructor = Rectangle - 這些原型對象是覆蓋從Base繼承的對象。

  • constructor參數instanceOf函數。您傳遞Rectangle那裏,所以constructor.prototypeRectangle原型對象,它繼承Base不同。

當我檢查REC的值在調試模式中,對象是基地{X = 0,Y = 0,W = 10,更...}

一般不。 Base是一些特殊的東西,例如一個主機對象?您的rec對象是Base的一個實例,因此可能會以不同的方式顯示。

rec只是一個對象從Rectangle.prototype繼承從Shape.prototypeBase.prototype它繼承了......假設Base是你定義的,從Object.prototypenull繼承功能繼承了繼承。

+0

是的,它在添加構造函數後有效:Shape.prototype.constructor = Shape和Rectangle.prototype.constructor = Rectangle。我還有一個問題:爲什麼rec是一個函數,而不是一個對象?在調試控制檯,它是函數{X = ,Y = ,W = ,更...} –

+0

還有一個問題:在改變之後,REC .__ proto__ .property成爲一個無限的矩形鏈。 __proto__ \t矩形(X,Y,W,H) \t 原型 \t矩形(X,Y,W,H) \t 原型 \t矩形(X,Y,W,H) \t 原型 \t矩形(X,Y,W,H) \t 原型 \t矩形(X,Y,W,H) \t 原型 \t矩形( x,y,w,h) –

+0

我錯過了我的構造函數賦值。它現在工作完美。謝謝! –

相關問題