关于js原型和继承的一个问题,这里的知识好难啃啊~

如果一个实例,通过继承而来,那么在这个实例上通过字面量的形式改变原型上存在的方法,会不会改变原型?

阅读 3.1k
6 个回答

这个和继承没什么关系。举个例子来说:

function Person(){
    this.name = '';
}

Person.prototype.getName = function(){
    return this.name;
}

var p = new Person();
p.speak = function(){
    // ...
}

//不知道题主说的是不是这个意思,上面给p对象添加了一个speak方法,只是添加到这个对象上,并不会影响到Person.prototype,就是说再new出来一个Person实例就不会有speak方法
var p1 = new Person();
p1.speak //undefined

//当然可以直接修改原型

p.__proto__.read = function(){}
p1.read //function(){}

为什么你不写两行代码,自己来尝试一下呢?测试这么个功能,并不需要很多代码吧

function ClassA(){};
ClassA.prototype.a = "原型链";

var test = new ClassA();
console.log(test.a);

test.a = "自定义";
console.log(test.a);

delete test.a;
console.log(test.a);

所以,你觉得会不会覆盖?

做个补充

var Person = function(name){
  this.name = name;
}

Person.prototype.getName = function(){
  console.log(this.name);
}

var p1 = new Person('张三');

p1.getName = function(){
  this.name = '李四';
  console.log(this.name);
} 

var p2 = new Person('王五');

p1.getName();   // 李四

p2.getName();   // 王五

肯定会覆盖啦亲。。。你最好就是使用 XXX.prototype.method1 = function () {...} 这样添加属性

学ES2015+Babel就不用啃了

推荐问题
宣传栏