2012-12-07 61 views
0

我是JS編程中的新手,並試圖理解基於原型的繼承。下面是我的測試代碼,我有一個關於線方法'parseParameters'的問題。Javascript繼承 - 創建成員

據我所知,當我實例化類Point,並擰下:

var p = new Point ({x: 1, y: 1}); 
alert(p.x); 

成員「X」,首先搜查Point類,然後在它的原型(形狀)。這樣對嗎?

問題本身:在Point類或Shape(原型)中,將在哪裏創建成員'x'和'y'?

一句話:我應該真的想到它嗎?也許這是微不足道的問題,並且無論成員在哪裏創建?

var Shape = function() {} 

Shape.prototype = { 
    getParameter: function (params, name) { 
     return params !== null && params !== undefined 
      ? params[name] 
      : 0; 
    }, 

    parseParameters: function(params, names) { 
     if (params === null || params === undefined) { 
      return; 
     } 

     for(var i = 0; i < names.length; i++) { 
      this[names[i]] = params[names[i]]; 
     } 
    } 
} 

var Point = function (params) { 
    this.parseParameters(params, ['x', 'y']) 
} 

Point.prototype = new Shape; 
+2

目前'Point'和'Shape'之間沒有鏈接。由於'Point'沒有'parseParameters'方法,你的實例化將失敗。 –

+0

固定!謝謝,我應該少工作。 –

回答

0

p.x

構件 'X' 首先搜索在Point類,然後在其原型(形狀)。這樣對嗎?

除了那個there are no "classes" in JavaScript,是的。該屬性名稱將首先在p對象本身上進行搜索,然後在它繼承的對象中進行搜索(有一個內部鏈接)。

將在Point類或Shape(prototype)中創建成員'x'和'y'?

取決於你如何:-)

創建它們在一個簡單的任務,像p.x = 1;(這也恰好在parseParameters'this[names[i]] = params[names[i]],作爲this === p)物業將在p對象被創建。

我應該真的想到它嗎?也許無論成員創建在哪裏?

不,這真的很重要。如果要在原型對象上創建它們,則從該對象繼承的所有對象都將共享相同的值。雖然這對於函數很有用,但對於數據屬性(例如xy)而言,這將是災難性的,應該因實例不同而異(例如,另請參閱Why are my JavaScript object properties being overwritten by other instances?)。