2014-09-30 37 views
1

有一天,我正在摆弄Javascript,并且我注意到我不能在原型函数中将原型写入对象。像这样:Javascript嵌套原型

var obj = function() { } 

obj.prototype.First = function() { 
    this.prototype.Second = function() { 
     alert("Second Prototype"); 
    } 
} 

obj.First(); 
obj.Second(); 

出于某种原因,第二个原型将无法工作,代码无法运行。我的语法是错误的还是有一些我不知道的原型限制?谢谢!

编辑:
我没有试图添加原型到原型......这没有多大意义。这就是我想要做的:将两个单独的原型添加到obj。原型2是在调用原型1时定义的。我认为this将包含对象的引用,因此this.prototype将与obj.prototype相同,但它不能按预期工作。

+0

为什么不直接使用'obj.prototype.Second = ...'? – 2014-09-30 00:12:52

+2

你正在混淆函数和实例。 – SLaks 2014-09-30 00:39:06

+0

'obj'是一个函数。 'obj.prototype'是函数的一个属性,只有当你用'new'调用函数时才会使用它。例如。 'var foo = new obj();'。 'foo.First'现在可用,因为'obj.prototype'是'foo'的原型。然而,'obj.First'不能工作,因为你从来没有在'obj'上创建'First'属性。 – 2014-09-30 20:53:03

回答

1

也许this可以帮助您理解构造函数和原型的作用。

取决于你想要做什么(OBJ,第一和第二并没有真正表现出你的意图),你可以这样做:

一个人的眼睛。这可以通过构图完成。

雇主是一个人,但一个人不一定是雇主(也可以是客户或顾问)。这可以通过继承完成。

猫可以移动。在基于类的语言中,Cat必须实现Movable,但在JavaScript中,您可以使用mix并将实现留给Movable提供或覆盖它的默认实现。 JavaScript不编译时间检查你是否执行某些事情。

如果您想在调用某个函数后更改对象实例的类型,那么插入原型会很危险,因为这会影响该类型的所有实例。

也许你应该返回另一个类型的实例。

var Customer = function(name) { 
    this.name=name || 'unknown'; 
}; 
Customer.createVipCustomer = function() { 
    return new VipCustomer(this); 
} 
var VipCustomer=function(customer){ 
    //re use Customer constructor 
    Customer.call(this,customer.name); 
    this.isVip=true; 
} 
//inherit the protype defined members 
VipCustomer.prototype=Object.create(Customer.prototype); 
VipCustomer.prototype.constructor=VipCustomer; 
VipCustomer.prototype.second=function(){ 
    console.log('this is second'); 
} 
var aCustomer = new Customer('Ben'); 
//update to VipCustomer 
aCustomer = Customer.createVipCustomer(aCustomer); 
aCustomer.second(); 
1

this.prototype不存在。

如果要将实体添加到实例,请使用this

如果要将属性添加到原型,请使用Constructor.prototype

此外,obj是一个函数(类),不是一个实例,
您希望使用new关键字来创建一个实例,你应该命名构造函数为UpperCamelCase。

+0

@ Blue0500我改变了我的答案。在审查你的问题时,你会希望实例在调用某个函数时改变类型。 – HMR 2014-09-30 03:17:24

1

这是一个古老的问题,但我想我会增加我的两分钱。 此代码试图在'原型'上添加函数。但是,这只能在类名上完成。你有什么是一个指向匿名类的变量。要访问匿名变量的变量,请使用'proto'。以下内容与您的示例相同,但使用原型它是'成功'的。虽然,我没有看到使用这种原型的好处,因为原型添加方法仅适用于匿名实例'obj'。http://jsbin.com/zapocamipi/edit?js,console

var obj = function() { } 

obj.__proto__.First = function() { 
    console.log("First Prototype"); 
    this.__proto__.Second = function() { 
     console.log(this); 
    } 
} 

obj.First(); 
obj.Second();