簡體   English   中英

在不創建新實例的情況下訪問構造函數的屬性

[英]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.

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