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;