Javascript对象原型混乱(带有require.js和three.js)
本质上,我感到困惑的是我对对象/原型的理解,require.js或three.js。下面是一个例子: TLDR: “wee”是“wee”的一个实例,它是三个…的包装器/猴子补丁。 因此“wee”不应该有三种属性和方法吗? (传递属性等等:a=b=c;a=c) 这就是我开始感到困惑的地方 chrome中的“测试”日志显示: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:
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不是一个函数”
问题:
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