我有两个JavaScript对象,一个(Scope1.js)通过将其原型设置为“基础”对象来“子类化”另一个(Scope2.js)。使用alert,我可以输出“base”对象的静态变量的期望值,但不能输出“subclass”对象的预期值。
预期产出
Scope1.staticVar1:scope1
Scope2.staticVar2:scope2
实际输出
Scope1.staticVar1:undefined
Scope2.staticVar2:scope2
有人可以说明我做错了吗?
这是我的代码:
Scope.html
<html>
<head>
<script src="Scope1.js"></script>
<script src="Scope2.js"></script>
<script>
function Init() {
alert("Scope1.staticVar1:"+Scope1.staticVar1);
alert("Scope2.staticVar2:"+Scope2.staticVar2);
}
</script>
</head>
<body onload="Init()"></body>
</html>
Scope1.js
function Scope1() {
Scope2.call(this);
}
Scope1.prototype = Object.create(Scope2.prototype);
Scope1.staticVar1 = "scope1";
Scope2.js
function Scope2() {
}
Scope2.staticVar2 = "scope2";
答案 0 :(得分:0)
function Scope1() {
Scope2.call(this);
}
//Scope is undefined
//You should be using Scope1
Scope.prototype = Object.create(Scope2.prototype);
Scope.staticVar = "scope1";
您将静态变量分配给 Scope
,但Scope
不存在。
只需将Scope
更改为Scope1
,即可开始使用。
然后,这是我的下一个建议:切换两个脚本标签。这背后的原因是第一个脚本在第二个脚本之前加载并运行。并且第一个脚本在加载之前引用第二个脚本中的一段代码。
我想@The说的是对的。它只传输我在浏览器控制台中测试过的原型变量。它不传输静态变量。
答案 1 :(得分:0)
您的作业Scope1.prototype = Object.create(Scope2.prototype);
只会为子类创建的实例设置原型继承链。类(构造函数)本身仍然继承自Function.prototype
。
您可以使用Object.setPrototypeOf(Scope2, Scope1)
来解决此问题,或使用ES6类(class Scope2 extends Scope1
)来实现此效果,但两者都无法在旧浏览器中使用。
在ES5中,您只能手动复制所有属性,或者只是不使用继承的静态属性。在提到静态属性时,您通常会知道它来自哪个类。