这个计算函数是否会被定义一次(放置在'obj'变量的原型链中)?如果不是,那么我怎样才能在原型链上获得calc函数,这样Obj的所有实例都将引用相同的calc函数?可以使用'this'关键字计算其属性的对象
我试着将计算函数赋值给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的构造的目的是创造当我定义的许多版本对象文本类型语法“物镜”,但允许使用“这个”的关键字的在以下方面来计算性能每个对象的其他属性。
这里是原型定义的版本,它不工作:
<!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>
因为你离开了' var'在你的“calc”函数的定义中,它是**全局**。 – Pointy
谢谢。我加了var以防止它走向全球。 – esnm
顺便说一句,你可以(应该)缩短到'var Obj = calc = function(){...}'。 'calc'被分配给一个全局变量是一个糟糕的问题,但不是一个实际的问题,因为它不是一个闭包。 – Bergi