Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在不创建新实例的情况下访问构造函数的属性_Javascript - Fatal编程技术网

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

Javascript 在不创建新实例的情况下访问构造函数的属性,javascript,Javascript,在不首先从构造函数对象/函数创建实例的情况下,是否可以访问其属性 例如,假设我有一个构造函数: 函数Cat(){ 这条腿=4; }; 现在–不创建新的cat实例–我想知道legs在构造函数中的值是多少。这可能吗 (我不是在寻找这样的东西:var legs=new Cat().legs(假设一个新Cat的实例化由于某种原因需要超级CPU。)在您的场景中,leg是一个实例变量,这意味着需要一个对象实例来访问它 您可以将其设置为伪类变量(请参阅),这样您就可以在不调用函数(实例化对象)的情况下访问它

在不首先从构造函数对象/函数创建实例的情况下,是否可以访问其属性

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

函数Cat(){
这条腿=4;
};
现在–不创建新的cat实例–我想知道
legs
在构造函数中的值是多少。这可能吗


(我不是在寻找这样的东西:
var legs=new Cat().legs
(假设一个新Cat的实例化由于某种原因需要超级CPU。)

在您的场景中,
leg
是一个实例变量,这意味着需要一个对象实例来访问它


您可以将其设置为伪类变量(请参阅),这样您就可以在不调用函数(实例化对象)的情况下访问它。

这更昂贵:

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

像这样的东西算数吗

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

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

简言之,不,如果不创建该变量的实例,则无法访问该变量,但可以解决该问题:

全局变量

假设“legs”可能随着应用程序的运行而变化,您可能希望通过将legs分配给“window”来创建一个“全局”变量,window是一个在页面的整个生命周期中都存在的对象:

window.legs = 4; // put this at the top of your script
然后,在整个应用程序过程中,您可以更改它,直到您准备在Cats()中使用它为止:

全局对象

如果希望CAT具有其他可变属性,甚至可以将对象指定给窗口:

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

有一百种方法可以做到这一点,但下面的静态默认模式与其中任何一种都一样好:

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;

也许在构造函数之外声明它,因为它是硬编码的?然后您可以将其传递给构造函数,也可以在构造函数外部访问它。您可以链接Cat:
函数Cat(){this.legs=4;返回此;}
=>
Cat().legs
。但是你仍然需要那些“CPU周期”来运行函数很多事情都是可能的,有些甚至没有意义:)。调用
Cat.toString()
并解析结果。感谢所有的答案!让我的问题更有意义:假设有一堆不同的猫品种名称,我想存储在猫的原型中,然后出于好奇访问“嗯,我想知道有哪些品种?”,无需为此目的创建新的cat。cat中的任何内容仅在函数执行期间存在(如果从函数返回,则可能在执行之后)。因此,要么将数据存储在函数外部,要么进行静态分析。没有足够的上下文来提供适当的解决方案。这避免了仅在表面上创建新实例。它无法避免“超级CPU昂贵”的实例化。我能不能(以一种干净的方式)不让legs成为一个实例变量?我想把它绑定到
这个
就是它的作用,但是我的选择是什么?@kristoferk将legs移到构造函数之外:
var legs=12;函数Cat(){this.legs=legs;…}
@Kristoferk:我更新了我的答案,并建议使用类变量。特别是因为match可能返回null,
null[1]
将抛出错误。;-)是的,你需要知道会员确实在那里,而且是一个号码,谢谢你的回答!是的,数据的全局/外部存储可能是我最终要做的事情,但我希望将所有这些都放在一个地方(最好是在构造函数内部)。但这一雄心壮志可能有缺陷,我可能需要重新思考。再次感谢。@Kristofer K关于
Amir Popovich
Answer你怎么说@Amir Popovich的回答仍然创建了一个Cat实例。从技术上讲,这是行不通的。
function Cat(){
  this.legs = window.legs;
  //or
  this.legs = window.Cat.legs;
}
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;