前几天我正在摆弄Javascript,我注意到我无法将原型写入原型函数中的对象。像这样:
var obj = function() { }
obj.prototype.First = function() {
this.prototype.Second = function() {
alert("Second Prototype");
}
}
obj.First();
obj.Second();
由于某种原因,第二个原型将无法运行,代码也无法运行。我的语法错了还是有一些我不知道的原型限制?谢谢!
修改:
我不打算将原型添加到原型中......这没有多大意义。这就是我要做的事情:向obj添加两个单独的原型。原型1被调用时定义了原型2。我认为this
将包含对象的引用,因此this.prototype
将与obj.prototype
相同,但它不会按预期工作。
答案 0 :(得分:2)
这是一个老问题,但我想我加了两分钱。 此代码试图在' prototype'上添加功能。但是,这只能在类名上完成。你拥有的是一个指向匿名类的变量。要访问匿名变量的变量,请使用' proto '。以下内容与您的示例相同,只是使用 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();
答案 1 :(得分:1)
this.prototype
不存在。
如果要向实例添加属性,请使用this
。
如果要向原型添加属性,请使用Constructor.prototype
。
此外,obj
是一个函数(类),而不是实例,
您希望使用new
关键字创建实例,并且应将构造函数命名为UpperCamelCase。
答案 2 :(得分:1)
也许this可以帮助您理解构造函数和原型的作用。
根据你想要做的事情(obj,First和Second并没有真正显示你的意图),你可以这样做:
一个人有眼睛。这可以通过作文来完成。
雇主是一个人,但一个人不一定是雇主(也可以是客户或顾问)。这可以通过继承来完成。
猫可以移动。在基于类的语言中,Cat必须实现Movable,但在JavaScript中,您可以使用mix ins并将实现保留为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();