gpt4 book ai didi

使用 "this = "的 Javascript 函数给出 "Invalid left-hand side in assignment"

转载 作者:数据小太阳 更新时间:2023-10-29 04:25:59 24 4
gpt4 key购买 nike

我试图让一个 JavaScript 对象使用另一个对象的构造函数的“this”赋值,并假定所有对象的原型(prototype)函数。这是我试图完成的示例:

 /* 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 的构造函数中重复所有 this.$* = * 赋值)和让 ObjY 假设 ObjX.prototype。

我的第一个想法是尝试以下方法:

function ObjY(a,b,c) {
this.prototype = new ObjX(a,b*12);
}

理想情况下,我想学习如何以原型(prototype)方式执行此操作(即不必使用任何“经典”OOP 替代品,如 Base2)。

可能值得注意的是 ObjY 将是匿名的(例如 factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... })——如果我的术语正确的话。

谢谢。

最佳答案

你不能真的那样做,因为 this根据定义,值是不可变的,您不能以这种方式更改它引用的内容。

解决方法是使用 callapplyObjYthis 对象中运行 ObjX 构造函数的方法:

function ObjY(a,b,c) {
ObjX.call(this, a, b * 12);
this.$c = c;
}

在上面的例子中,ObjX 函数执行时改变了它的 this 值,所以你在这个函数中对该对象所做的所有属性扩展,都会反射(reflect)在this 值在 ObjY 构造函数中引用的新对象。

一旦 call 方法结束,this 对象将被扩充,您可以进行更多属性扩展,例如添加您的 $c值(value)。

编辑: 关于原型(prototype),您的示例将不起作用,因为 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

推荐文章:

关于使用 "this = "的 Javascript 函数给出 "Invalid left-hand side in assignment",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com