Javascript对象原型混乱(带有require.js和three.js)

Javascript对象原型混乱(带有require.js和three.js),javascript,oop,three.js,requirejs,prototype,Javascript,Oop,Three.js,Requirejs,Prototype,本质上,我感到困惑的是我对对象/原型的理解,require.js或three.js。下面是一个例子: TLDR: “wee”是“wee”的一个实例,它是三个…的包装器/猴子补丁。 因此“wee”不应该有三种属性和方法吗? (传递属性等等:a=b=c;a=c) 这就是我开始感到困惑的地方 chrome中的“测试”日志显示: test Object {REVISION: "66", CullFaceNone: 0, CullFaceBack: 1, CullFaceFront:

本质上,我感到困惑的是我对对象/原型的理解,require.js或three.js。下面是一个例子:

TLDR: “wee”是“wee”的一个实例,它是三个…的包装器/猴子补丁。

因此“wee”不应该有三种属性和方法吗?

(传递属性等等:a=b=c;a=c)

这就是我开始感到困惑的地方

chrome中的“测试”日志显示:

test
Object {REVISION: "66", CullFaceNone: 0, CullFaceBack: 1, CullFaceFront: 2, CullFaceFrontBack: 3…}
这很好。我的目标是创建一个包含3.js的猴子补丁

然而,当我在chrome中登录wee时,它显示:

 wee
 Wee {prototype: Object, width: 1920, height: 1102, aspectRatio: 1.7422867513611615}
扩展原型细节我可以看到原型是Wee,这是三个-这也是很好的。。。但让我困惑的是,在我的代码后面我会这样做:

var renderer = new wee.WebGLRenderer();
它返回“undefined”

我也试过了

var renderer = wee.WebGLRenderer;
var renderer = wee.WebGLRenderer();
所有这些操作都会失败,并出现“UncaughtTypeError:undefined不是一个函数”

问题:
  • 发生什么事了
  • 我错过了什么
  • 首先,为什么三个函数可以工作,因为我的define函数需要它,但没有将它分配给任何东西
  • 我问的问题对吗?有什么不同的表达方式可以让我下次用谷歌搜索
  • 这一行:

    this.prototype = new WEE();
    
    在对象上创建一个名为
    prototype
    的属性。它不设置对象的基础原型(不称为
    prototype
    ;目前在标准中它是匿名的,一些实现称它为
    \uuuuproto\uuu
    )。您也可以将该属性称为
    robert

    对象的原型(目前)通过以下两种方式之一设置:

  • 如果通过
    new FunctionName
    创建对象,则其基础原型将从
    FunctionName中设置。当使用
    new
    操作符时,prototype
    指的是什么

  • 如果通过
    object.create
    创建对象,则传递到
    object.create
    以分配原型的内容就是对象

  • 因此:

    但值得注意的是:

    function Foo() {
        this.prototype = {
            bar: 42
        };
    }
    var f = new Foo();
    console.log(f.bar);           // undefined
    console.log(f.prototype.bar); // 42
    
    请注意,在由
    new Foo
    创建的实例上创建名为
    prototype
    的属性不会设置该实例的原型

    这是JavaScript最大的困惑之一:函数上的
    prototype
    属性不是函数的原型,而是通过
    new FunctionName
    创建对象时
    new
    将分配给对象的原型。对象没有任何表示其原型的命名属性(目前,交叉实施)


    在ES6(规范的下一个版本)中,
    \uuuuu proto\uuuuu
    属性访问器很可能被定义为允许我们直接访问和设置对象的原型。(它在规范草案中,这意味着它被清除了多个审查级别;我现在看不到它被删除。)目前SpiderMonkey(Firefox的JavaScript引擎)支持这一点,其他一些人也可能支持,但它不是标准的。

    在你的
    WEE
    函数中,
    THREE;
    行非常可疑,我怀疑它没有做你认为它做的事情。如果
    THREE
    是一个范围内变量,它将抛出一个
    ReferenceError
    否则它就没有其他效果了t、 仅供参考,
    newwee()
    ,simple返回
    THREE
    。因此您可以只编写
    var test=THREE;
    。和
    WEE.call(此)
    也没有做任何事情,因为你没有用
    这个
    内部
    WEE
    @t.J.Crowder做任何事情,这也是我的想法,但出于某种原因,它不会在任何地方抛出错误。@FelixKling的想法是WEE最终将成为一个工厂函数,我只是还没有实现。@AndrewLuhring:
    三个
    m那么必须定义。所以它是不可操作的:它检索
    THREE
    变量的值,然后对它不做任何处理。你可以完全删除
    THREE;
    行。哈,我想
    \uuuuu proto\uuuu
    不会成为标准的一部分。但你是对的。我猜有一些来回。@FelixKling:是的,我是我没听清楚,但我打赌这是一场激烈的讨论。老实说-@t.J.Crowder你回答了我的主要问题;我还没有把它标记为答案的唯一原因是因为我还需要3.和4.的答案。我不想把它标记为已回答,因为没有人会看它,我仍然会对3.和4.一无所知。@AndrewLuhring:我帮不了你,除了说我不明白如果你要求把它包括在内为什么它不起作用。在我看来,你使用了合理的条款。
    function Foo() {
    }
    Foo.prototype = {
        bar: 42
    };
    var f = new Foo();
    console.log(f.bar); // 42
    
    var f = Object.create({
        bar: 42
    });
    console.log(f.bar); // 42
    
    function Foo() {
        this.prototype = {
            bar: 42
        };
    }
    var f = new Foo();
    console.log(f.bar);           // undefined
    console.log(f.prototype.bar); // 42