2012-01-31 56 views
1

我需要在JavaScript中超級簡單的繼承的超可讀版本。這是一些自動生成的代碼,我不能使用外部函數或庫。非常簡單的Javascript繼承

我真正想要的是,假設三維點「繼承」從點,我想是這樣的:

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

function Point3d(x,y,z) { 
    Point(x, y); 
    this.z = z; 
} 

只是它不實際工作:

var pt = new Point3d(230,30,11); 
// but x and y are in global scope, they should be in pt.x and pt.y :(

一種可能的選擇,會在代碼生成中複製所有成員 - 但由於Javascript是基於原型的,我想這很容易做到(如果我真的知道Javascript)

謝謝

+0

要設置繼承:'Point3d.prototype =的Object.create(Point.prototype);' – 2012-01-31 01:29:33

回答

7

使用.call()Point構造函數應用於Point3d對象。

function Point3d(x,y,z) { 
    Point.call(this, x, y); 
    this.z = z; 
} 

http://jsfiddle.net/MSfu5/

.call方法設置的this在你調用函數的值。

這裏我們將其設置爲正在構建的新對象Point 3d


如果有對Point原型任何Point3d要繼承,可以使Point3d.prototype對象的Point一個空的實例。

+1

感謝您的快速答覆。我不知道'call'這正是我所希望的 – Heptic 2012-01-31 01:43:31

1

您需要創建一個開始的對象。

function Point(x,y) { 
    return { x: x, y: y } 
} 

function Point3d(x,y,z) { 
    var self=new Point(x, y); 
    self.z=z; 
    return self; 
} 
var pt = new Point3d(230,30,11); 
+1

-1這個繼承模型被打破了。 「構造函數」不返回期望的對象,它返回**不從**(或Point3d)繼承的其他對象。使用「我不是我」的答案。 – RobG 2012-01-31 02:33:09

+0

OP似乎在詢問如何基於另一個擴展數據結構,這就是我的回答。你是對的,這不會創建適當的對象(我最近做了更多的perl) – 2012-01-31 03:42:51