2010-03-14 207 views
4

我有一个简单的代码片段在JS与原型继承工作。Javascript:原型继承和原型属性

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

//the following code block has a alternate version 
var mammal = { 
    color: "brown", 
    getColor: function() { 
     return this.color; 
    } 
} 

var myCat = object(mammal); 
myCat.meow = function(){return "meow";} 

这工作得很好,但添加此:

mammal.prototype.kindOf = "predator"; 

没有。 (“mammal.prototype是不确定的”

因为我猜测对象也许有没有原型我重写了它,取代了var哺乳动物= {...封锁:

function mammal() { 
    this.color = "brown"; 
    this.getColor = function() { return this.color; } 
} 

这给了我很多其他的错误:

“Function.prototype.toString叫不兼容的对象”
,如果我尝试调用_myCat.getColor()
“myCat.getColor是不是一个函数”


现在我完全糊涂了。在阅读Crockford和Flanagan之后,我没有得到解决错误的方法。所以,如果有人知道这将是伟大的...

- 为什么在第一个例子中未定义的原型(这是最关心的问题,我认为)在对象明确设置原型(功能)

- 为什么让我这些奇怪的错误试图使用哺乳动物功能作为对象()函数中的原型对象?

编辑对这个问题的创造者:这两个环节上帮助了很多太:

在spheredev维基Prototypes_in_JavaScript解释原型属性适用relativily简单的方式。它缺少的是一些试用代码示例。一些很好的例子由Morris John's Article提供。我个人发现,解释并不像第一个链接那么简单,但仍然非常好。 即使在我真正了解它之后,最困难的部分实际上不是混淆.prototype propery和对象的内部[[Prototype]]。

回答

5

你得到的第一个错误(mammal.prototype是未定义),因为mammal是一个对象,该prototype属性添加,当他们created,当你想拥有的功能constructors它应该被用来发挥作用的对象。

我想你是混淆该属性与内部[[Prototype]]财产。

[[Prototype]]属性只能由new运营商通过[[Construct]]内部操作设置。

此属性无法访问(尽管有一些方法,如在通过obj.__proto__;的Mozilla实现或新的ECMAScript 5 Object.getPrototypeOf方法中)。

关于你的第二个问题,你会得到这些错误,因为你正在创建一个新的对象,它继承自一个函数,而不是另一个对象。

什么:

var mammal = { 
    color: "brown", 
    getColor: function(){ 
    return this.color; 
    }, 
    kindOf: "mammal" // "base" value 
}; 
// ... 
var tiger = object(mammal); 
tiger.roar = function(){return "roar";} 
tiger.kindOf = "predator"; // specific value 

在上面的代码中,从mammal继承所有的情况下,将有一个kindOf属性,当您创建更具体的哺乳动物对象以后可以改变。

编辑:在回答您的意见,是的,语言本身让你知道该工具时,Object.prototype.hasOwnProperty方法,它返回一个布尔结果,表明对象是否有物理指定的属性或没有,例如, :

var obj = { 
    foo: 'bar' 
}; 

obj.hasOwnProperty('foo'); // true 
obj.hasOwnProperty('toString'); // false, inherited from Object.prototype 

您也可以直接拨打电话的Object.prototype这个方法,所以如果有人名的对象上的属性hasOwnProperty,它不会失败:

Object.prototype.hasOwnProperty.call(obj, 'foo'); // true 
+0

临屋恩,这很有帮助。原型仍然让我困惑。你知道萤火虫或其他工具是否可以确定一种方法/属性是“直接属于某个对象还是通过(内部)原型来引用?它会帮助我很多简单地尝试学习。 – JanD 2010-03-14 11:38:12

+0

@ JanD,看看我的编辑... – CMS 2010-03-14 17:37:48

+0

当然,有人也可以修改Object.prototype.hasOwnProperty,但是如果你的代码做这样的事情,所有的投注都关闭。 – 2010-03-15 23:31:58