- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我试图让一个 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
根据定义,值是不可变的,您不能以这种方式更改它引用的内容。
解决方法是使用 call
或 apply
在 ObjY
的 this
对象中运行 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/
我试图理解 java.util.concurrent.locks 库,并希望实现两个通过列表运行的线程,而第二个线程不应超过(领先)第一个线程。具体来说,我想实现手动锁定。 我写了下面的代码,但不起作
我正在寻找 Adobe Reader 中的张开的手/闭合的手 鼠标光标。他们在哪里?如果它们是非标准的,我用 C# 创建它们的最简单方法是什么? 最佳答案 是的,它们是非标准的。您只需要四处搜索,
我有这些警告,但我不知道如何解决它们。 warning: left-hand operand of comma has no effect warning: right-hand operand of
我在网站上寻求帮助,但仍然找不到此问题的答案。 这是代码: import java.util.Scanner; public class Player { private Card[] hand; p
当我尝试这样做时出现错误 friend std::ostream& operator<<(std::ostream& os, const hand& obj) { return obj.sho
我之前没有学过javascript,完全不知道自己该怎么做,因为我只是跟着别人的项目,希望有人能告诉我如何修改这些错误的地方。谢谢T_T 最佳答案 改变 function aniSprite (col
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
题目地址:https://leetcode.com/problems/hand-of-straights/description/ 题目描述 Alice has a hand of cards,
我有一个包含几个变量的循环;其中一个在每一步递增。然而,有时,这个变量可能会被重置为 0。因此我可以写: (loop with z = 0 ... do (progn
在 this link ,期望的结果是当光标悬停在图例上时,鼠标不会变为手形。我怎样才能实现它? 我不确定,但是这样的东西有用吗? window.setTimeout("document.body.s
我有一个 GameActivity 和一个 GameOverActivity。我将游戏积分保存在 GameActivity 中,但会在 GameOverActivity 中显示这些积分。我必须做什么?
这个问题已经有答案了: Output of System.out.println(object) (4 个回答) 已关闭 9 年前。 我不确定为什么会得到这个输出。当我尝试为我的扑克程序打印一手牌时。
我使用 carousel bootstrap 3 来使用幻灯片文本。当第 1 行文本长到底部(例如:高度 300 像素)而第 2 行文本太短(例如:仅 10 像素)时,问题是当我们单击第 # 行旁边时
如何使用 JavaScript 在 td 元素中添加样式属性 cursor? 我已经试过了: var tabla = document.getElementById("table"); var fil
有没有办法从导入的模块中获取异常处理输出并从调用程序中处理它?例如,我有一个写入 HTTP 异常的导入模块 except urllib2.HTTPError, e: sys.stderr.wri
我在这里遵循 W3C 的标准 http://www.w3.org/TR/CSS2/ui.html在这里 http://www.quirksmode.org/css/cursor.html#note .
我正在使用 Unity 构建汽车模拟器游戏。对于输入,我使用 Logitheck 方向盘 G29。现在我需要使用 Hand Controller 来加速或刹车。这是我的手控器手控器 HC1 Link
我在 chrome 浏览器中运行我的 flutter 应用程序,它会显示以下错误。 Do not call didCreateEngineInitializer by hand. Start with
我想为我的 Lable 设置一个鼠标监听器,这样当用户将鼠标放在标签上时,我可以将光标更改为 HAND_CURSOR。 我试图设置样式 css“cursor: hand;”对于这个标签,但是在运行
我正在使用 idTCPServer 来处理数据。对于新设备,我需要将套接字移交给 dll(停止 tcp 服务器从该套接字读取数据)。 Indy 或 ICS 可以实现这一点吗? [编辑]出于测试目的,我
我是一名优秀的程序员,十分优秀!