[英]The difference between referring to a function and calling it ( this.myFunc vs this.myFunc() )
[英]Difference between myFunc.prototype vs new myFunc().prototype
function myFunction() {};
myFunction.prototype.foo = "bar";
var myFuncInstance = new myFunction();
console.log('myFunction.foo: ' + myFunction.foo); // Prints undefined
console.log('myFuncInstance.foo: ' + myFuncInstance.foo); // Prints bar
為什么myFunction.foo
在這里打印undefined
? 我已經將屬性foo設置為myFunction.prototype.foo = "bar"
。
在這種情況下, myFunc
不是對象,它表示對象的類 。 這意味着您可以使用new
關鍵字創建與該類prototype
具有相同屬性的對象。 這並不意味着您在函數本身上獲得了一系列新屬性。
按照你的例子,這將工作:
function myFunction() {};
myFunction.prototype.foo = "bar";
var myFuncInstance = new myFunction();
console.log('myFunction.prototype.foo: ' + myFunction.prototype.foo);
console.log('myFuncInstance.foo: ' + myFuncInstance.foo);
當你將一些變量聲明到對象的prototype
中時,你將值附加到該對象的任何實例,因此定義到prototype
的值將可以通過實例訪問,因此當調用myFunction.foo
你正在嘗試調用.foo
變量as一個靜態變量,因為myFunction是構造函數而不是該構造函數的實例,當你調用myFuncInstance.foo
myFuncInstance
已經是一個實例,所以你可以訪問.foo
變量,因為它被定義為'protototype'。
那么你何時真的需要訪問這個myFunction.foo
你應該將它定義為
function myFunction() {};
myFunction.foo = 'static bar'; // it can be accessed without instance
所以當你調用myFunctionInstance.foo
,你應該定義如下
function myFunction() {};
myFunction.prototype.foo = 'instance bar'; // it can be accessed with instance
var myFunctionInstance = new myFunction();
myFunctionInstance.foo; // will print 'instance bar'
眾所周知,JavaScript 對象從原型 繼承 屬性和方法 。
在第二個log
您有一個正確的實例( Prototype Inheritance )
並且在第一個日志中,您正在訪問function property
而沒有任何實例(直接使用函數名稱)。
您將需要一個實例(myFuncInstance)
來訪問該屬性而不是function
本身。
當你使用時,每個對象都有一個原型.
獲得一個對象的屬性。 首先,它會找到自身的屬性,如果沒有得到目標屬性,它會找到它的原型屬性,如果仍然沒有得到目標屬性,它將繼續查找其proertype屬性的屬性。 在這之后,這個案子變得容易了。
在使用new
,你會得到一個實例myFuncInstance
,當使用myFuncInstance.foo
,beacause本身沒有一個名為foo
的屬性,它將從它的構造函數myFunction
的原型中獲取屬性foo
。
但是,當使用myFunction.foo
, myFunction
alse沒有一個屬性調用foo
,它會找到它的原型Function.prototype
,它也找不到foo
,所以找到Function.prototype
的原型Object.prototype
,它仍然可以找不到,所以找到Object.prototype
的原型null
,所有的原型鏈都找不到foo
,所以它是undefined
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.