不
f().apply(scope);
只是
f.apply(scope);
(無()
後f
。)你想使用apply
函數的函數f
對象上,而不是通話功能f
和訪問apply
在其回報價值上。
要還傳遞您在setScope
函數接收參數,補充一點:
f.apply(scope, arguments);
arguments
是一個隱含參數所有功能,這是傳遞給函數的實際參數的僞陣列在運行時。 apply
接受任何類似數組的東西作爲其第二個參數來指定調用基礎函數時使用的參數。
我想也有它返回的返回值:
return f.apply(scope, arguments);
所以setScope
變爲:
Function.prototype.setScope = function (scope) {
var f = this;
return function() {
return f.apply(scope, arguments);
}
}
Live example
注意平時的名字此功能,名稱它在新的ECMAScript5 standard中,是bind
(第15.3.4.5節; ECMAScript5的bind
也可以讓你curry參數,這不是由此實現完成的)。 setScope
是一個特別不幸的名字,因爲它沒有設置範圍,它設置了上下文。
說了這麼多,沒有理由在您的Person
構造函數中需要setScope
。你可以這樣做:
Person = function() {
var self = this;
this.Name = "asd";
var _public = new Object();
_public.Name = function (value) {
if (value == undefined) {
return self.Name;
} else {
self.Name = value;
}
};
return _public;
};
Live example
但使用bind
(又名setScope
)可以在地方,你不想在你正在做它在上下文中的新的閉包是有用的。
題外話:你指定Person
將打破某些東西的人可能希望的工作方式,如:
var p = new Person();
alert(p instanceof Person); // Expect "true", but in your case will be "false"
...因爲你要替換的對象new
爲你創建,但是從構造函數中返回一個不同的對象(它覆蓋了默認值)。
而不是創建一個新的對象並返回,在你的構造,允許你構造的對象由new
爲對象(因此Person
關係保持不變),但你仍然可以得到真正的私有變量和使用存取:
function Person() {
// Private variable
var name = "asd";
// Accessor function
this.Name = function(value) {
if (typeof value === "undefined") {
return name;
}
name = value;
};
}
Live example
正如你所看到的,這是大大簡化,它保留了instanceof
關係。請注意,我們並沒有在Name
範圍內限定我們對name
的引用,因此我們在構造函數調用中使用局部變量,其中創建了關閉它的Name
函數。
我也冒昧給了構造函數名稱,因爲I'm not a fan of anonymous functions。我應該給訪問者一個名稱,以及:
function Person() {
// Private variable
var name = "asd";
// Accessor function
this.Name = Person_Name;
function Person_Name(value) {
if (typeof value === "undefined") {
return name;
}
name = value;
}
}
題外話2:在JavaScript代碼中壓倒一切的慣例是,在功能名稱中使用首字母大寫只的構造函數(如Person
),而不是其他類型的功能(如Name
)。當然,你可以自由地做任何你喜歡的事情,但是我認爲我會提到這個慣例,因爲它讓其他人更容易閱讀你的代碼。
值得注意:這些技術的所有導致每一個Person
對象具有存取功能的它自己副本。如果將會有很多這些對象,那可能是一個內存問題。如果只有幾個,那很好。
所以新的Person()返回一個封閉的綁定到這個_public.Name函數。這是一個相當複雜的創建類的方法,它不是返回一個對象,而是返回一個函數。這可能不是你想要做的。但是很難從所提供的代碼示例中猜出您想實現的目標。 –
@Jean:*「這是一種相當複雜的方式來創建一個類,而不是返回一個對象,返回一個函數。」*它不返回一個函數對象,只是一個對象。該對象具有分配給其「名稱」屬性的功能。儘管如此,我認爲這不是我該怎麼做的。 –
^^你是對的,它確實會返回一個對象,但這是一個相當複雜的方式,用於做一些其他方面微不足道的事情。 –