1
// Sim.App - application class (singleton)

    Sim.App = function()
    {   
        this.renderer = null;
        this.scene = null;
        this.camera = null;
        this.objects = [];
    }

    // Constructor
    EarthApp = function()
    {
        Sim.App.call(this);
    }

// Subclass Sim.App
EarthApp.prototype = new Sim.App();

==============================================

在上面,我不明白为什么作者使用这个语句

EarthApp.prototype = new Sim.App();

他本可以使用

EarthApp = new Sim.App();

请帮助我理解该语句中“原型”的使用。

4

2 回答 2

4

线

EarthApp.prototype = new Sim.App();

...创建一个Sim.App对象并将其分配给函数的prototype属性EarthApp。这意味着当我们这样做时:

var e = new EarthApp();

...e对象将从EarthApp.prototype其原型中获取对象,使其能够访问该对象的属性和方法。


FWIW,该代码实现的继承并不理想,因为它调用Sim.App构造函数来创建EarthApp.prototype对象,然后再次调用它来初始化实例。如果您想以这种方式将构造函数链接在一起,这是更正确的方法:

// Reusable `derive` function
// Set up `child`'s `prototype` property to be based on `parent`'s `prototype` property
function derive(child, parent)
{
    function ctor()
    {
    }

    ctor.prototype = parent.prototype;
    child.prototype = new ctor();
    child.prototype.constructor = parent;
}

// Sim.App - application class (singleton)
Sim.App = function()
{   
    this.renderer = null;
    this.scene = null;
    this.camera = null;
    this.objects = [];
};

// Constructor
EarthApp = function()
{
    Sim.App.call(this);
};

// Subclass Sim.App
derive(EarthApp, Sim.App);

您可能想查看我的Lineage帮助脚本,它执行上述操作并处理正确处理“超级调用”等所需的所有管道。

还值得注意的是,这只是使用 JavaScript 原型继承的一种方式,它非常灵活。

于 2013-10-15T07:39:19.347 回答
4

原型是 Javascript 继承模型中的基础部分。我建议您阅读它,因为如果不了解它,您将无法完全“获得” JS。

话虽如此,将对象分配为函数的原型会使该对象位于随后创建的该函数的每个实例的原型链中。

原型链的工作方式是(或多或少)(参见下面的示例):

  1. 您尝试访问对象中的“foo”变量
  2. 如果这个对象有“foo”,返回它的值。
  3. 如果此对象没有“foo”,请查看它的原型(在您的情况下为“Sim.App”实例) - 它是否有“foo”?如果是,则返回它的值。
  4. 如果对象的原型没有“f​​oo”,请查看原型的原型 - 依此类推,通过链向上。

如果您想了解更多相关信息,请查看这篇文章

示例 - 考虑:

var Sim = {};
Sim.App = function () {
    this.foo = 'sim';
}

EarthApp = function () {
}

EarthApp.prototype = new Sim.App();

var earth = new EarthApp();

// I can access earth.foo even though 'earth' is an instance of 'EarthApp' 
// and not 'Sim.App'. That's because instance of 'Sim.App' is in 
// earth's prototype chain.
console.log(earth.foo);
于 2013-10-15T07:39:27.473 回答