JavaScript中Prototype面向对象编程的最佳方法

时间:2011-05-06 21:23:13

标签: javascript inheritance constructor prototype createobject

我更喜欢原型编程方式,并且一直试图在javascript中理解它。

我在好的部分中看到了这段代码:

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

我根本没有得到这个哈哈。如果您只需要将原型设置为过去的对象,那么您不能这样做:

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

更新: 你的问题非常广泛,我认为我不能在这里用简短的答案做正义。你可能想看看下面的SO问题,它对JS原型进行了很好的讨论,以及一些链接其他人发现对此主题有帮助的东西。

How does JavaScript .prototype work?

答案 2 :(得分:1)

您只能将prototype添加到功能对象中。通过 new 调用时,它会将其用作原型。

顺便说一下,你引用的函数是新版ECMAScript的一部分Object.create(附加propertiesObject参数)。

让我这样说吧:{object}单身人士function() object构造函数,也就是说,当使用 new 调用时,会创建实例(通过执行函数的主体,并使用构造函数的原型)。当然原型也可以是一个函数对象,并且有自己的原型等。 Specialization Generalization 意味着在原型链中走来走去。

答案 3 :(得分:1)

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

var parent = {
   num : 666
};

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

var child = new ChildConstructor();

http://jsfiddle.net/W9C3K/

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

答案 4 :(得分:0)

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