簡體   English   中英

關於Javascripts Prototype的幾個問題

[英]A few questions about Javascripts Prototype

我從經典的OOP背景來看Javascript並且在理解原型方面遇到了麻煩。

給出下面的代碼示例:

  1. 我如何在foo中調用/執行bar?
  2. 為什么要使用“特權”功能而不是把它放在原型上?
  3. 這可能在第一季回答,但bar1和bar2可以互相呼叫嗎?

     function foo() { this.property = "I'm a property"; this.privileged = function() { // do stuff } } foo.prototype.bar = function() { // do stuff } foo.prototype.bar2 = function() { // stuff } 

到目前為止,有很多關於此的FUD。

1)。 用法簡單:

var xxx = new foo();  // Create instance of object.
xxx.privileged();  // Calls the internal closure.
xxx.bar();  // First looks for internals, then looks to the prototype object.

2)。 這基本上創建了一個只能在實例上修改的閉包。 根本不是私有的(因為任何東西都可以通過對象實例與它交談),而是函數的單個副本,其中對象的每個實例都獲得該函數的新副本。 您可以更改函數本身,但不能全局更改它。 我不是這種創造方法的忠實粉絲。

3)。 是:

foo.prototype.bar = function(){
    this.bar2();
}

foo.prototype.bar2 = function(){
    this.bar();
}
// Although... NEVER do both.  You'll wind up in a circular chain.

為了啟發,我為你建立了一個小提琴,它應該有助於展示如何調用它們: http//jsfiddle.net/7Y5QK/

1)frist是Clyde Lobo的答案:

var f = new foo();
f.bar();

2)在consturctor上寫一個函數(特權),每個實例都會創建一個新的,如果在prototype上定義了一個方法,每個實例共享同一個prototype的方法:

var f1 = new foo(), // instance 1
    f2 = new foo(); // instance 2

f1.privileged === f2. privileged // -> false , every instance has different function
f1.bar === f2.bar // -> true, every instance share the some function

3)你可以bar' by this.bar()來調用bar' by bar2 ,代碼如下:

function foo() {
   this.property = "I'm a property";

   this.privileged = function() {
      // do stuff
   };
}

foo.prototype.bar = function() { // defined a method bar
    alert('bar called');
    this.bar2(); // call bar2
};

foo.prototype.bar2 = function() { // defined a method bar2
    alert('bar2 called');
};

var f = new foo();
f.bar(); // alert 'bar called' and 'bar2 called'
f.bar2(); // alert 'bar2 called'
  1. 你可以通過執行this.bar();來執行foo中的bar this.bar(); 但它只有在你使用new foo();時才有效new foo(); 並且有一個繼承自foo的對象。 否則,如果你只是調用foo(); this將指向全局對象。

  2. 它本質上是相同的,只有你給函數內部的繼承對象提供的屬性和方法才能訪問你傳遞給foo任何參數。

  3. 是的,他們可以互相打電話,因為功能是“懸掛的”。 他們可以訪問最近的外部作用域中的所有變量和對象,以及它們的功能上下文。

您的代碼中確實存在語法錯誤。 在分配原型的地方,您沒有創建函數。 你的意思是:

foo.prototype.bar = function() { /* ... */ };

你可以創建一個像foo的例子

var f = new foo();

然后調用f.bar()f.bar2()

大衛已經解釋了第2點和第3點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM