无法访问子类另一个JavaScript对象的JavaScript对象中的静态变量

时间:2016-01-23 20:41:29

标签: javascript

我有两个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";

2 个答案:

答案 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中,您只能手动复制所有属性,或者只是不使用继承的静态属性。在提到静态属性时,您通常会知道它来自哪个类。