首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习.prototype

学习.prototype
EN

Stack Overflow用户
提问于 2013-07-15 17:23:29
回答 2查看 505关注 0票数 8

编辑:对于那些将来看到这篇文章的人来说, http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 无疑是我理解Javascript的关键。如果您来自传统的OOP背景,我强烈建议您这样做。UML-esq图非常棒.

我仍然无法理解Javascript中的.prototype属性是什么。它仅仅是对另一个对象的引用吗?还是对指向另一个对象的指针的引用?我来自C/C++/x86,只是不知道它是如何工作的。让我们来看看我目前如何看待事物的一些例子;看看事情是如何工作的,这将有助于指出我的错误。我甚至不知道其中一些是否是有效的语法。ObjectFunction分别是全局对象/函数对象。

代码语言:javascript
复制
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

我真的很困惑。

代码语言:javascript
复制
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 ?

我也不理解在周围交换原型。

代码语言:javascript
复制
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

我搞不懂这个概念。我不太明白。我不知道克隆对象是如何获得它们自己的本地数据副本的,但是对原始对象(原型)的更改却以某种方式级联到克隆中。我一直在摆弄FigureBug的尝试,但在精神上我想不出一个与我所见过的每一个例子相一致的想法

C++可能是一个巨大的怪物,但至少我知道到底在做什么。这里..。我在用我最好的猜测..。我想只是一个新的范例。不管怎样,如果你能帮忙的话.我在这个.prototype上被搞砸了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-15 20:35:14

哇,这可是很多问题。让我们仔细研究一下。

它仅仅是对另一个对象的引用吗?还是对指向另一个对象的指针的引用?

JavaScript中没有指针。然而,持有“一个对象”的变量或属性实际上保存了对该对象的引用,因此其他变量可以保存对同一对象的引用。

Global.prototype =?

全局对象(如果需要的话是window),其中定义了所有全局变量,但没有原型(在某些环境中不关心异常)。

我仍然无法理解Javascript中的.prototype属性是什么。

.prototype属性是所有函数对象都具有的属性,指向它们的原型对象(一个普通对象)。

您不能将其与每个对象所具有的内部原型引用混淆。该原型指向查找属性的对象,而该对象本身没有属性。

Function.prototype =?

这是所有函数对象继承的对象。它包含像callbind这样的东西。

变量obj1 = {};// obj1 1.= Object var func1 = function() {};// Function 1原型=函数

是的,有点。我想你已经有了这个概念,但不知道术语。虽然func.prototype是另一回事,但obj.prototype属性甚至不存在。但是,您指的是内部原型--我们可以通过Object.getPrototypeOf函数访问它们。它们不引用构造函数,而是引用它们的原型对象。以下是更正:

代码语言:javascript
复制
Object.getPrototypeOf(obj1) === Object.prototype
Object.getPrototypeOf(func1) === Function.prototype

是“新Foo”还是“new()”?

没关系,它们是等价物。只有在要传递参数时才需要显式地使用括号。

var Foo = function() { this.prop1 = 0;} var foo =新Foo();

再说一遍,你的假设是正确的,但表达错了。让我们仔细研究一下细节。

上面,我谈到了“原型对象”。那些是什么?它们是用每个函数隐式创建的普通对象。在本例中,它是Foo.prototype --一个空对象。因此,我们在这里处理三个对象:Foo构造函数、它的Foo.prototype原型对象和foo实例。

foo有什么特别之处?这是new操作符做的第一件事。当函数作为构造函数被调用时--使用new --则访问它的.prototype属性,并将一个新对象实例化,并将其内部原型设置为该原型对象。这才是奇迹。之后,在新实例上调用函数,以便this是新对象;在您的示例中,它在实例上创建.prop1属性。然后返回结果(并分配给foo)。

现在怎么利用那个魔法?重点是在prototype对象上创建属性,然后继承它。

代码语言:javascript
复制
// modify `Foo.prototype`, the object which `foo` inherits from:
Foo.prototype.prop2 = 1;
console.log(foo.prop2); // 1!

我也不理解在周围交换原型。

问题是这是不可能的。一旦实例化,对象的原型链就会非常静态。然而,你不需要那么频繁。

goo.prototype = new ();

这不起作用,因为.prototype属性与您预期的不一样。

var c=新C();C.prototype =新A();

这只起了一点点作用。上面看一下new做了什么-它只查找构造函数的.prototype属性一次。内部原型将保持锁定状态--您不会更改c实例。但是,如果现在要创建一个新实例var d = new C(),那么它将继承A实例。

我希望这有帮助,如果你还有其他问题,请发表意见。

票数 4
EN

Stack Overflow用户

发布于 2013-07-15 17:36:22

在读取过程中,当对象本身没有定义属性时,原型用于搜索属性。写入总是发生在对象本身上。

当你打电话的时候

代码语言:javascript
复制
// An instance of Foo ({prop1:0}) is set as the 
// prototype (to all instances of Goo)
var goo = new Goo();

// 0, from the prototype
console.log(goo.prop1); 

// Read from the object itself (set in Goo's constructor)
console.log(goo.prop2); 

// New instance, same prototype as goo
var goo2 = new Goo();
console.log(goo2.prop1) ; // 0, still from the prototype

// Setting is always at the object level, not the prototype
goo.prop1 = 5;

// goo2 is still reading from the prototype
console.log(goo2.prop1); 

N.B.

不要仅仅为了设置继承而实例化父类。看看为什么在这里http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17660090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档