5

我试图让一个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); ... }) - 如果我拥有正确的术语。

谢谢。

+1

相关:[?为什么我不能指定一个新值“本”的原型函数(HTTP:// stackoverflow.com/q/9713323/1048572) – Bergi 2014-11-15 20:36:29

回答

15

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

一种解决方法是使用了callapply方法中的ObjYthis对象运行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

推荐的文章:

+1

谢谢CMS。伟大的联系,也是。另一个问题是如何分配原型 - 可以从构造函数中完成吗? – 2010-03-12 05:02:36

+0

@Brian,不客气,是的,我有一个错字! – CMS 2010-03-12 05:06:14

+0

@Brian,将ObjX的对象设置为ObjY的原型,以获得它的方法。 'ObjY.prototype = new ObjX;'。如果在当前对象中找不到方法和属性,则在原型链中查找。 – Anurag 2010-03-12 05:10:36

相关问题