1

我更喜欢原型的编程方式,并且一直在尝试用 javascript 来理解它。

我在 The Good Parts 中看到了这段代码:

function beget(o){
  function F(){
    F.prototype = o;
  };
  return new F();
};

我完全不明白,哈哈。如果您所要做的就是将原型设置为过去的对象,那么您不能这样做:

var parent = {
  num = 66;
};
var child = {
  prototype: parent
};

这似乎不起作用,因为 child.num 返回为未定义。您如何描述 javascript 原型编程以及您的方法是什么?多谢你们

4

5 回答 5

2

个人认为最惯用的方法如下:

function Parent() {
    this.value = 2;
}

function Child() {

}

Child.prototype = new Parent();

var c = new Child();
alert(c instanceof Child); // true
alert(c instanceof Parent); // true
alert(c.value); // 2
于 2011-05-06T21:30:27.833 回答
1

.prototype属性对 JavaScript 具有特殊意义,但仅适用于函数,这就是您的代码不起作用的原因。

使用“典型继承”,您不会从基类继承。相反,您从某个对象开始并创建一个新对象,使用第一个对象作为原型。然后向新创建的对象添加属性和方法。

我不确定您所说的“您的方法是什么?”是什么意思?你的意思是编程方法,还是类似的东西?

更新:您的问题非常广泛,我认为我不能在这里用简短的回答来做到这一点。您可能想看看下面的 SO 问题,它对 JS 原型以及一些其他人认为对这个主题有帮助的东西的链接。

JavaScript .prototype 是如何工作的?

于 2011-05-06T21:29:47.183 回答
1

您只能添加prototype到函数对象。当通过它调用时new,它将使用它作为它的原型。

顺便说一句,您引用的函数是 ECMAScript 新版本的一部分Object.create(带有附加propertiesObject参数)。

让我这样说:{object}是一个单例。然而, Afunction() object是一个构造函数,也就是说,当调用 with 时new会创建一个实例(通过执行函数的主体,并使用构造函数的原型)。当然原型也可以是一个函数对象,有自己的原型等等。专业化泛化就是在原型链上走上走下。

于 2011-05-06T21:31:31.237 回答
1

第二个示例不起作用,因为您只是设置了对象的属性。您要做的是设置构造函数的原型属性,然后从该函数创建一个对象。

var parent = {
   num : 666
};

function ChildConstructor(){
   console.log(this.num);
}
ChildConstructor.prototype = parent;

var child = new ChildConstructor();

http://jsfiddle.net/W9C3K/

如果没有专有方法,就不可能在对象上设置或更改原型。

于 2011-05-06T21:32:08.407 回答
0
var parent = {
  num : 66
};
var child = {
   __proto__: parent
};
于 2011-05-06T21:36:04.230 回答