使用“this =”的Javascript函数给出了“赋值中无效的左侧”
我试图让一个JavaScript对象使用另一个对象构造函数的“this”赋值,并假设所有对象的原型功能。这里就是我试图完成的例子:使用“this =”的Javascript函数给出了“赋值中无效的左侧”
/* The base - contains assignments to 'this', and prototype functions
*/
function ObjX(a,b) {
this.$a = a;
this.$b = b;
}
ObjX.prototype.getB() {
return this.$b;
}
function ObjY(a,b,c) {
// here's what I'm thinking should work:
this = ObjX(a, b * 12);
/* and by 'work' I mean ObjY should have the following properties:
* ObjY.$a == a, ObjY.$b == b * 12,
* and ObjY.getB == ObjX.prototype.getB
* ... unfortunately I get the error:
* Uncaught ReferenceError: Invalid left-hand side in assignment
*/
this.$c = c; // just to further distinguish ObjY from ObjX.
}
我会就如何有ObjY归入物objx的任务,以“这个”你的想法感激(即不必重复所有this.$* = *
分配中ObjY的构造函数)并且ObjY假定ObjX.prototype。
我首先想到的是尝试以下操作:
function ObjY(a,b,c) {
this.prototype = new ObjX(a,b*12);
}
理想我想了解如何在原型的方式做到这一点(即没有使用任何的“经典” OOP代用品像Base2)。
值得注意的是,ObjY将是匿名的(例如factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }
) - 如果我拥有正确的术语。
谢谢。
你不能这样做,因为this
定义的值是不可变的,你不能以那种方式改变它所引用的内容。
一种解决方法是使用了call
或apply
方法中的ObjY
的this
对象运行ObjX
构造函数:
function ObjY(a,b,c) {
ObjX.call(this, a, b * 12);
this.$c = c;
}
在上面的例子中,执行ObjX
函数改变其this
值,因此您在此函数中对该对象所做的所有属性扩展都将反映在this
值在ObjY
构造函数中引用的新对象中。
一旦call
方法结束,this
对象将被增强,您可以创建更多属性扩展,如添加$c
值。
编辑:关于原型,您的样品将无法正常工作,因为prototype
酒店在立场对象没有特殊的意义将是就像任何其他财产,应该在构造函数使用。
我想你可能会混淆构造函数的prototype
属性与所有对象具有的内部[[Prototype]]
属性。
的[[Prototype]]
财产只能由new
操作(通过[[Construct]]
内部操作)来设定,这个属性不能改变的,(虽然有些实现,如Mozilla的一个,你可以通过obj.__proto__;
访问,并在ECMAScript 5,Object.getPrototypeOf
方法已经被引入,但我不建议你直接混淆它)。
实际上,当您的构造函数被执行时,this
值引用的对象的内部[[Prototype]]
属性已被设置为其构造函数的prototype
属性。
所以,作为@Anurag评论,你可以设置ObjY.prototype
到新创建的ObjX
对象:
function ObjY(a,b,c) {
ObjX.call(this, a, b * 12);
this.$c = c;
}
ObjY.prototype = new ObjX();
ObjY.prototype.constructor = ObjY;
这将使你的ObjY
也继承的属性添加到ObjX.prototype
,正如你看到的,我更改了ObjY.prototype.constructor
,因为上面一行中的分配将使该属性错误地指向ObjX
。
推荐的文章:
相关:[?为什么我不能指定一个新值“本”的原型函数(HTTP:// *.com/q/9713323/1048572) – Bergi 2014-11-15 20:36:29