Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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 如何创建使用prototype';s属性_Javascript_Prototypal Inheritance - Fatal编程技术网

Javascript 如何创建使用prototype';s属性

Javascript 如何创建使用prototype';s属性,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我试图创建一些类似于静态语言的东西“静态字段”。基本上:计数器属性应该在每次调用init函数时递增,但不管是在哪个实例上。这是我用来测试()的示例代码: 当前,当我运行console.log instances时,我看到proto和instance都包含counter属性。我认为,使用这种方法,只有proto才会拥有它 那个么,我怎样才能将其更改为原型中只有计数器呢 var twitter = (function() { var counter = 0; return {

我试图创建一些类似于静态语言的东西“静态字段”。基本上:计数器属性应该在每次调用init函数时递增,但不管是在哪个实例上。这是我用来测试()的示例代码:

当前,当我运行console.log instances时,我看到proto和instance都包含counter属性。我认为,使用这种方法,只有proto才会拥有它

那个么,我怎样才能将其更改为原型中只有计数器呢

var twitter = (function() {
    var counter = 0;
    return {
        init : function() { counter++; console.log("init called: " + counter); }
    };
}()); 

var t1 = Object.create(twitter);
var t2 = Object.create(twitter);

t1.init();
t2.init();


因此,您只需创建IEFE(立即执行的函数表达式),以返回所需的对象。“代码>计数器/<代码>变量对于该对象的代码<> init < /Cult>函数是可用的。

可以通过定义构造函数的属性来模拟静态字段,但是如果您喜欢使用<代码>对象。创建< <代码>代替<代码>新< /代码>,那么这可能不是您要考虑的解决方案。

var Widget = {
    init: function () {
        this.prototype.counter++;
        console.log("init called: " + this.counter);
    }
};
Widget.prototype.counter = 0;

var t1 = Object.create(Widget);
var t2 = Object.create(Widget);
t1.init();
t2.init();
console.log(t1);
console.log(t2);
function Widget() {
    this.init()
};

Widget.counter = 0;

Widget.prototype.init = function() {
    this.constructor.counter++;
    console.log("init called: " + this.constructor.counter);
};

问题是您通过
init()
中的
this
进行访问。简单地说,您可以用
小部件
替换
这个
,它将按预期工作。好的,它工作:)谢谢。但你能不能解释一下为什么这个计数器不使用prototype的计数器?我认为如果“this”上没有设置字段,JavaScript引擎将访问prototype的字段。您应该写一个答案——这是可能的解决方案之一。我已经将JSFIDLE更新为与问题中相同的代码。太好了!但是prototype有可能达到同样的结果吗?@dragonfly:这个解决方案好一点,因为你没有直接访问变量的权限,它不起作用:Widget.prototype.counter=0;抛出错误“UncaughtTypeError:无法设置未定义的属性“counter”。奇怪。。。未初始化的原型,可以使用
Widget.prototype={}对其进行初始化使用前。但它不会是“真实”的原型。就我所记得的,只有函数才有真正的原型属性,当“new”操作符与函数一起使用时,才会使用这个属性。。。但我宁愿让专家确认任何对象(不是标量)都有一个原型,在JS函数中是一个对象。zerkms的解决方案更好,我只是尝试对现有代码进行最小的修改;log(Object.getPrototypeOf(Widget))。也是:函数是一个对象,但对象不是函数。小部件是一个对象:console.log(小部件的类型)。如果我错了,请纠正我:)
function Widget() {
    this.init()
};

Widget.counter = 0;

Widget.prototype.init = function() {
    this.constructor.counter++;
    console.log("init called: " + this.constructor.counter);
};