可以使用'this'关键字计算自己属性的对象

时间:2014-03-05 18:06:17

标签: javascript object this prototype-chain

这个calc函数是否会被定义一次(放在' obj'变量的原型链上)?如果没有,那么我怎样才能在原型链上得到calc函数,所以Obj的所有实例都将引用相同的calc函数?

我尝试将calc函数分配给Obj.prototype.calc,但是当' obj'如果已创建,则无法在创建过程中找到它。

window.onload = function () {
    var Obj = function (obj) {
        var calc = function (o) {
            for (p in o) {
                if (o.hasOwnProperty(p) && typeof o[p] === 'function') {
                    o[p] = o[p]();
                }
            }
            return o;
        };
        return calc(obj);
    };

    function test() {
        var obj = new Obj({
            a: 1,
            b: 2,
            c: function () {
                return this.a + this.b;
            },
            d: function () {
                return this.b * this.c;


   }
    });
    window.console.log(obj.a); // 1
    window.console.log(obj.b); // 2
    window.console.log(obj.c); // 3
    window.console.log(obj.d); // 6
}
test();

}

当我定义许多版本的' obj'时,Obj构造函数的目的是创建一个对象文字类型语法。但允许使用'这个'用于根据每个对象中的其他属性计算属性的关键字。

这是原型定义的版本,它不起作用:

<!DOCTYPE HTML>
<html>
<head>
<script>
window.onload = function () {
    var Obj =   function (obj) {
                    return calc(obj);
                };
    Obj.prototype.calc = function (o) {
                            for (p in o) {
                                if (o.hasOwnProperty(p) && typeof o[p] === 'function') {                        
                                    o[p] = o[p]();
                                }
                            }
                            return o;
                        };
    function test() {
        var obj = new Obj({
            a:      1,
            b:      2,
            c:      function () {return this.a + this.b;},
            d:      function () {return this.b * this.c;}
        });
       window.console.log(obj.a); 
       window.console.log(obj.b); 
       window.console.log(obj.c); 
       window.console.log(obj.d); 
    }
    test();   

}
</script>
</head>
<body>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

  

这个calc函数是否会定义一次(放在'obj'变量的原型链上)?

不,每次调用Obj函数时都会重新创建它。 (另请注意,正如Pointy,呃,指出,你正在使用calc符号成为The Horror of Implicit Globals的牺牲品。)

  

如果没有,那么我怎样才能在原型链上得到calc函数,所以Obj的所有实例都会引用相同的calc函数?

把它放在那里,然后从那里使用它:

Obj.prototype.calc = /* ...the function, use `this` rather than an argument... */;

Obj

this.calc(); // No `return` needed

简化示例:

var Foo = function(x, y) {
    this.x = x;
    this.y = y;
    this.calc();
};
Foo.prototype.calc = function() {
    this.z = this.x + this.y;
};

var f = new Foo(2, 3);
console.log(f.z); // "5"