js 原型继承开发

在学习js原型继承开发时,发现两种原型方法,区别是什么呢?

function Dialog(){}


Dialog.prototype.fun1 = function(){
  console.log("fun1");
}

Dialog.prototype.fun2 = function(){
  console.log("fun2");
}


---------------------------------------------
Dialog.prototype = {
  
  constructor: this,
  fun1:function(){
    console.log("fun1");   
  },
   fun2:function(){
    console.log("fun2");   
  }
} 
阅读 2.5k
4 个回答

是不是想问这个问题?
通过原型链实现继承的时候,不能使用对象字面量创建原型方法,因为这样会重写原型链

function SuperType() {
    this.property = true;
}

SuperType.prototype.getSuperValue = function () {
    return this.property;
}

function SubType() {
    this.subproperty = false;
}

//继承了SuperType 
SubType.prototype = new SuperType();

//使用字面量添加新方法,会导致上一行代码无效 
SubType.prototype = {
    getSubValue: function () {
        return this.subproperty;
    },
    someOtherMethod: function () {
        return false;
    }

}
var instance = new SubType();
alert(instance.getSuperValue()); //error

如果和继承挂钩的话一般都是第二种写法,constructer 应该指回该实例。还有一点组合式继承多应用于第二种方式。

原型本身是一个对象,Dialog.prototype指向这个对象,第一种方式相当于修改这个对象的属性,第二种方式相当于让prototype重新指向一个对象。

第一种方式不会导致你在别的地方给这个原型加的属性无效。
第二种方式要慎用,因为你可以先用第一种方式修改prototype,然后第二种方式直接覆盖掉了,之前给原型加的东西就没了。

var obj = {};
obj.fun1 = function(){
    console.log("fun1");
}
obj.fun2 = function(){
    console.log("fun2");
}
var obj = {
    fun1:function(){
        console.log("fun1");
    },
    fun2:function(){
        console.log("fun2");
    },
};

就你发的代码而言唯一的区别是 下面的constructor是可以被枚举到的
ps:你第二个的constructorthis有问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题