在不创建新实例的情况下访问构造函数的属性

时间:2015-04-21 13:19:40

标签: javascript

是否可以访问构造函数对象/函数的属性而无需先从中创建实例

例如,假设我有这个构造函数:

function Cat() {
  this.legs = 4;
};

现在 - 没有创建新的cat实例 - 我想知道构造函数中legs的值是什么。这可能吗?

(而且我不是在寻找像var legs = new Cat().legs这样的东西。(假设由于某种原因,新Cat的实例化是超级CPU昂贵的。)

6 个答案:

答案 0 :(得分:4)

这样的事情算了吗?

function Cat() {
  this.legs = 4;
}

var obj = {};
Cat.call(obj);
console.log(obj.legs); // 4

答案 1 :(得分:1)

在您的方案中,leg是一个实例变量,这意味着需要一个对象实例才能访问它。

您可以将其设为伪 - class variable(请参阅class variable in Javascript),然后您应该可以在不调用函数的情况下访问它(实例化对象)。

答案 2 :(得分:1)

这更贵:

console.log(parseInt(Cat.toString().match(/this\.legs\s*=\s*(\d+)/)[1]));

答案 3 :(得分: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;

答案 4 :(得分:0)

简而言之,如果没有创建它的实例,你就无法访问该变量,但是你可以解决它:

全局变量

假设'腿'可能因应用程序运行而异,您可能希望创建一个" global"通过将分支分配给“窗口”来变量,这是一个在整个页面生命周期中都存在的对象:

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;
}

答案 5 :(得分:-3)

// 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
相关问题