编辑:对于那些将来看到这篇文章的人来说,这个网站对于我消化Javascript无疑是至关重要的.如果你来自传统的OOP背景,我强烈推荐它.UML-esq图很棒.
我仍然无法理解Javascript中的.prototype属性.它只是对另一个对象的引用吗?或者它是指向另一个对象的指针?我来自C/C++/x86,看不出它是如何工作的.让我们看看我目前如何看待事物的一些例子; 它有助于指出我的错误,看看事情是如何运作的.我甚至不知道其中一些是否是有效的语法.Object并且Function分别是全局对象/功能对象.
1 // Global.prototype = ??
2 // Function.prototype = ??
3
4 var obj1 = {}; // obj1.prototype = Object
5 obj2 = {}; // obj2.prototype = Object
6
7 var func1 = function() {}; // func1.prototype = Function
8 func2 = function() {}; // func2.prototype = Function
9 function func3() {} // func3.prototype = Function
10
Run Code Online (Sandbox Code Playgroud)
我很困惑.
11 var Foo = function() { this.prop1 = 0; }
12 var foo = new Foo(); // should it be 'new Foo' or 'new Foo()'?
13 // Foo.prototype = Function
14 // foo.prototype = Foo
15 var Goo = function() { this.prop2 = 0; }
16 var goo = new Goo();
17 // goo.prototype = Goo
18 goo.prototype = new Foo();
19 // goo.prop1 now exists ?
Run Code Online (Sandbox Code Playgroud)
我也不明白交换原型.
20 function A () {
21 this.prop1 = 1;
22 }
23 function B () {
24 this.prop2 = 2;
25 }
26 function C () {
27 this.prop3 = 3;
28 }
29 C.prototype = new B();
30 var c = new C();
31 // c.prop1 = 1
32 // c.prop2 = 2
33 // c.prop3 = undefined
34 C.prototype = new A();
35 // c.prop2 = 2???
36 // c.prop3 = 3
Run Code Online (Sandbox Code Playgroud)
我无法掌握这个概念.我不太明白.我不知道克隆对象如何获得自己的本地数据副本,但对原始对象(原型)的更改以某种方式级联到克隆.我一直在努力摆弄FigureBug尝试的事情,但在精神上我无法想出一个与我见过的每个例子一致的想法
C++可能是一个巨大的怪物,但至少我知道到底发生了什么.在这......我正在使用我最好的猜测..我想是一个新的范例.无论如何,谢谢,如果你可以帮忙......我在这个.prototype上颠倒了.
哇,有很多问题。让我们来研究一下它们。
它只是对另一个对象的引用吗?或者它是对另一个对象的指针的引用?
JavaScript 中没有指针。然而,持有“对象”的变量或属性实际上持有对该对象的引用,因此其他变量可以持有对同一对象的引用。
Run Code Online (Sandbox Code Playgroud)Global.prototype = ??
定义所有全局变量的全局对象(window如果您愿意)没有原型(不关心某些环境中的异常)。
我仍然无法理解 Javascript 中的 .prototype 属性是什么。
该.prototype属性是所有函数对象都具有的属性,指向它们的原型对象(普通对象)。
您不能将它与每个对象具有的内部原型引用混淆。该原型指向在其中查找对象本身不具有的属性的对象。
Run Code Online (Sandbox Code Playgroud)Function.prototype = ??
这是所有 Function 对象都继承自的对象。它包含诸如call或 之类的东西bind。
Run Code Online (Sandbox Code Playgroud)var obj1 = {}; // obj1.prototype = Object var func1 = function() {}; // func1.prototype = Function
是的,有点。我认为您已经了解了这个概念,但不知道术语。虽然func.prototype是另一回事,但该obj.prototype财产甚至不存在。但是,您指的是内部原型- 我们可以通过函数访问它们Object.getPrototypeOf。而且它们引用的不是构造函数,而是它们的原型对象。这是更正:
Object.getPrototypeOf(obj1) === Object.prototype
Object.getPrototypeOf(func1) === Function.prototype
Run Code Online (Sandbox Code Playgroud)
应该是“new Foo”还是“new Foo()”?
这并不重要,它们是等价的。仅当您想要传递参数时才需要显式使用括号。
Run Code Online (Sandbox Code Playgroud)var Foo = function() { this.prop1 = 0; } var foo = new Foo();
再说一次,你的假设是正确的,但表达是错误的。让我们来研究一下细节。
上面,我谈到了“原型对象”。那些是什么?它们是用每个函数隐式创建的普通对象。在本例中,它Foo.prototype是一个空对象。所以我们在这里处理三个对象:Foo构造函数、它的Foo.prototype原型对象和foo实例。
有什么特别之处foo?这是操作员要做的第一件事new。当一个函数作为构造函数被调用时 - with new- 然后它的.prototype属性被访问,并且一个新对象被实例化,其内部原型设置为该原型对象。这就是神奇的事情。之后,在新实例上调用该函数,这this就是新对象;在您的情况下,它会.prop1在实例上创建属性。然后返回结果(并分配给foo)。
现在如何使用这个魔法呢?重点是在原型对象上创建属性,然后该属性将被继承。
// modify `Foo.prototype`, the object which `foo` inherits from:
Foo.prototype.prop2 = 1;
console.log(foo.prop2); // 1!
Run Code Online (Sandbox Code Playgroud)
我也不明白交换原型。
问题是这是完全不可能的。一旦实例化,对象的原型链就完全静态了。但是,您并不需要那么频繁。
Run Code Online (Sandbox Code Playgroud)goo.prototype = new Foo();
但这不起作用,因为该.prototype房产不是您所期望的。
Run Code Online (Sandbox Code Playgroud)var c = new C(); C.prototype = new A();
这只起到一点作用。看看上面的内容new- 它只查找.prototype构造函数的属性一次。然后内部原型保持锁定状态 - 您不能更改c实例。但是,如果您现在创建一个新实例,var d = new C()那么它将继承该A实例。
我希望这有帮助; 如果您还有其他问题请评论。
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |