8

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

 /* 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”(即不必重复this.$* = *ObjY 的构造函数中的所有赋值)并让 ObjY 假定 ObjX.prototype 的想法。

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

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

理想情况下,我想以原型的方式学习如何做到这一点(即不必使用任何像Base2这样的“经典”OOP 替代品)。

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

谢谢你。

4

1 回答 1

19

您不能真正做到这一点,因为this根据定义,值是不可变的,您不能以这种方式更改它所引用的内容。

一种解决方法是使用callor方法在以下对象中apply运行ObjX构造函数:thisObjY

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 5Object.getPrototypeOf中已经引入了该方法,但我不建议你直接弄乱它)。

实际上,当你的构造函数被执行时,值所引用[[Prototype]]的对象的内部属性this已经被设置为其构造函数的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

推荐文章:

于 2010-03-12T04:56:04.877 回答