2012-06-05 84 views
3

我對node.js很陌生,也可能是javascript,所以隨意指出一些看起來很尷尬的東西。我在這裏學習。node.js,require()和原型繼承

這裏就是我想要做的事:

  • 「約翰」的對象應該繼承一切從「客戶」對象,包括代替「新」關鍵字功能
  • 使用的Object.create()實例化新的對象和繼承

這裏是工作的單個文件測試:

var sys=require('sys'); 
var Client = { 
    ip: null, 
    stream : null, 
    state: "Connecting", 
    eyes: 2, 
    legs: 4, 
    name: null, 
    toString: function() { 
     return this.name + " with " + 
     this.eyes + " eyes and " + 
     this.legs + " legs, " + this.state + "."; 
    } 
} 
var john = Object.create(Client, { 
    name: {value: "John", writable: true}, 
    state : {value: "Sleeping", writable: true} 
}); 
sys.puts(john); // John with 2 eyes and 4 legs, Sleeping 

下面是當我把它分解成不同的文件會發生什麼:

---- ---- client.js

module.exports = function (instream, inip){ 
    return { 
     ip: inip, 
      stream : instream, 
      state: "Connecting", 
      eyes: 2, 
      legs: 4, 
      name: null, 
      toString: function() { 
      return this.name + " with " + 
       this.eyes + " eyes and " + 
       this.legs + " legs, " + this.state + "."; 
      }, 
    }; 

}; 

---- ---- john.js

var Client = require("./client"); 
module.exports = function (inname, instate){ 
    return Object.create(Client, { 
     state : {value: inname, enumerable: false, writable: true}, 
     name: {value: instate, enumerable: true, writable: true}, 
    }); 

}; 

---- ---- main.js

var sys = require("util"); 
var Client = require("./client")("stream","168.192.0.1"); 
sys.puts(Client); // null with 2 eyes and 4 legs, Connecting 

var john = require("./john")("John","Sleeping"); 
sys.puts(john); //Function.prototype.toString no generic 
sys.puts(sys.inspect(john)); // { name: 'Sleeping' } 
sys.puts(sys.inspect(john, true)); // {name: 'Sleeping', [state]: 'John'} 

問題:

  1. 我在分割文件和使用require()時會出現問題?
  2. 爲什麼約翰對象有「睡眠」的名稱和「約翰」的狀態?我知道這是我把行的順序,但它應該不能說明我已經把在構造函數中的參數?
  3. 是否有這樣做的更好的辦法?我傾向於學習的Object.create(),而不是依賴於「新」的關鍵字。
+0

這看起來像一個語法錯誤。 client.js中的exports函數缺少表示'return {'和'};'的行。 –

+0

糟糕,你是對的。現在修復。它在文件中沒有正確剪切和粘貼。 – howdoicodethis

回答

2

在#2:

return Object.create(Client, { 
    state : {value: inname, enumerable: false, writable: true}, 
    name: {value: instate, enumerable: true, writable: true}, 
}); 

這是在你的身邊交換innameinstate一個簡單的錯誤輸入。

在#1:

我懷疑原單文件代碼和新的3檔代碼之間的另一個微小的差別是有過錯的。一則留言引起了我的眼睛MDN's page on Object.create,具體而言,

當然,如果在構造函數中實際的初始化代碼,該的Object.create不能反映它

client.js文件產生構造函數。你的意思在john.js寫的是(合併#1和#2):

return Object.create(Client(), { 
    state : {value: instate, enumerable: false, writable: true}, 
    name: {value: inname, enumerable: true, writable: true}, 
}); 

呼叫客戶端功能,因此它返回一個對象,而不是一個函數,然後創建建立在之上的新對象那。

在#3:

我不明白爲什麼你不能使用這種模式,但你剛纔證實,它是:

  1. 國外對大多數JavaScript對象是如何創建的今天(儘管毫無疑問是一種更快的施工機制)。
  2. 使用更新的語法(即刪除new),因此語法錯誤不會像使用舊的Java風格的語法那樣「跳出來」。

只要記住這一點。我很高興你問這個問題,因爲現在我知道Object.create。 :)

+0

我完全尷尬的迷霧。 = ^^ =感謝您的支持!現在一切正常,非常感謝! – howdoicodethis