[英]Accessing property of constructor without creating new instance
是否可以在不先從中創建實例的情況下訪問構造函數對象/函數的屬性?
例如,假設我有這個構造函數:
function Cat() {
this.legs = 4;
};
現在 - 沒有創建一個新的cat實例 - 我想知道構造函數中的legs
值是什么。 這可能嗎?
(而且我不是在尋找像這樣的東西: var legs = new Cat().legs
。(假設新Cat的實例化由於某些原因而超級CPU昂貴。))
這樣的事情算什么?
function Cat() {
this.legs = 4;
}
var obj = {};
Cat.call(obj);
console.log(obj.legs); // 4
在您的場景中, leg
是一個實例變量,這意味着需要一個對象實例才能訪問它。
你可以把它變成一個偽class variable
(參見Javascript中的類變量 ),然后你應該能夠在不調用函數的情況下訪問它(實例化對象)。
這甚至更貴:
console.log(parseInt(Cat.toString().match(/this\.legs\s*=\s*(\d+)/)[1]));
有一百種方法可以做到這一點,但下面的靜態默認模式與其中任何一種一樣好:
function Cat(opts) {
var options = opts || {};
this.legs == options.legs || Cat.defaults.legs;
};
Cat.defaults = {
legs: 4
}
var myCat = new Cat({legs:3}); //poor guy
var normalNumberOfCatLegs = Cat.defaults.legs;
簡而言之,如果沒有創建它的實例,你就無法訪問該變量,但是你可以解決它:
全局變量
假設“leg”可能隨着應用程序的運行而變化,您可能希望通過將“leg”指定為“window”來創建“全局”變量,這是一個在整個頁面生命周期中都存在的對象:
window.legs = 4; // put this at the top of your script
然后在整個應用程序的過程中,您可以更改此內容,直到您准備好在Cats()中使用它:
window.legs = user_input;
全球對象
如果您希望Cats具有其他可變屬性,您甚至可以將對象分配給窗口:
window.Cat = {};
window.Cat.legs = 4;
window.Cat.has_tail = true;
window.Cat.breeds = ["siamese","other cat breed"];
如何使用Globals
然后,當稍后創建Cat對象時,您可以從窗口中提取數據以創建Cat的實例:
function Cat(){
this.legs = window.legs;
//or
this.legs = window.Cat.legs;
}
// cat.js
function Cat() {
}
Cat.prototype.legs = 4;
// somescript.js
var legs = Cat.prototype.legs
var cat = new Cat();
console.log(legs, cat.legs); // 4, 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.