Javascript嵌套原型

时间:2014-09-30 00:06:44

标签: javascript prototype

前几天我正在摆弄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相同,但它不会按预期工作。

3 个答案:

答案 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();