可以在构造函数中重写prototype吗?
发布于 9 年前 作者 Silence-Zhang 5570 次浏览 最后一次编辑是 8 年前 来自 问答

在构造函数中重写了prototype,访问不了其中的方法. e.g.

function Persion(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
	Persion.prototype={
    	sayName:function(){
        	console.log(this.name);
    	}
	}; 
}
var per=new Persion('Nicolas','23','software engining');
per.sayName();  //运行时会报错,没有sayName方法

但是把Persion.prototype={...}放在构造函数外就可以访问…

4 回复

说明… new 的时候先执行 this.__protp__ = Person.prototype;,再执行Person.apply(this, arguments);… 下面这个代码可以用。。

function Persion(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    Persion.prototype={
        sayName:function(){
            console.log(this.name);
        }
    };
}
Persion.prototype = {
  sayName: function() {
    console.log('default name');
  }
}
var per1=new Persion('Nicolas','23','software engining');
per1.sayName();
var per2=new Persion('Nicolas','23','software engining');
per2.sayName();

new 过一次以后Persion的prototype就是楼主想要的对象了。 第一个new函数执行的时候Person.prototype还是一个空对象 输出

➜  ~  node a
default name
Nicolas

btw:构造函数里重写prototype不是好思路…在prototype里面定义的函数已经能访问到this对象了。

instance哭着说,你来晚了sayName

放在外面,构造函数外面。

prototype放里面有啥意义?难道你还想if else 一下?

回到顶部