[英]A few questions about Javascripts Prototype
我從經典的OOP背景來看Javascript並且在理解原型方面遇到了麻煩。
給出下面的代碼示例:
這可能在第一季回答,但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'
你可以通過執行this.bar();
來執行foo中的bar this.bar();
但它只有在你使用new foo();
時才有效new foo();
並且有一個繼承自foo
的對象。 否則,如果你只是調用foo();
, this
將指向全局對象。
它本質上是相同的,只有你給函數內部的繼承對象提供的屬性和方法才能訪問你傳遞給foo
任何參數。
是的,他們可以互相打電話,因為功能是“懸掛的”。 他們可以訪問最近的外部作用域中的所有變量和對象,以及它們的功能上下文。
您的代碼中確實存在語法錯誤。 在分配原型的地方,您沒有創建函數。 你的意思是:
foo.prototype.bar = function() { /* ... */ };
你可以創建一個像foo的例子
var f = new foo();
然后調用f.bar()
和f.bar2()
大衛已經解釋了第2點和第3點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.