这个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>
答案 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"