【问题标题】:suppress main function call with function defined in prototype使用原型中定义的函数抑制主函数调用
【发布时间】:2015-04-29 14:27:50
【问题描述】:

看看下面的代码:

function person() {
  this.fname = 'baby';
  this.lname = 'boy';
  this.walk = function () {
    return 'i can walk';
  }
}
person.prototype.walk=function(){ return 'all can walk';}


var obj=new person();

obj.walk();

现在我想在我的代码中同时使用这两个功能,但希望当我使用 obj.walk() 调用 walk 时...它应该从原型调用 walk 函数,结果返回我“所有人都可以行走” '

【问题讨论】:

  • 如果你想这样做,为什么要在构造函数中添加“walk”属性?你想达到什么目的?
  • 这里有一个类似的问题已经得到解答,可能会有所帮助:stackoverflow.com/questions/12183011/…
  • 为什么这个问题是-2...因为要么直接不可能,这确实不像第一个答案所描述的那样...所以你可以为这个问题删除-2吗??跨度>

标签: javascript oop


【解决方案1】:

您可以delete obj.walk 仅删除该特定对象的属性,并强制它使用继承的方法。

function person() {
  this.fname = 'baby';
  this.lname = 'boy';
  this.walk = function () {
    return 'i can walk';
  }
}
person.prototype.walk=function(){ return 'all can walk';}


var obj=new person();

delete obj.walk;

console.log(obj.walk());

【讨论】:

    【解决方案2】:

    这是一种方法,但我相信它需要 ES5。

    function person() {
      this.fname = 'baby';
      this.lname = 'boy';
      this.walk = function () {
        return 'i can walk';
      }
    }
    person.prototype.walk=function(){ return 'all can walk';}
    
    
    var obj=new person();
    
    obj.walk();
    
    //to call the prototype's function
    Object.getPrototypeOf(obj).walk.call(obj);
    

    【讨论】:

      【解决方案3】:

      这种行为——当你调用foo.bar()时,它首先检查“foo”是否有一个名为“bar”的方法,然后只有在没有找到的时候才检查原型——是JS的核心部分,而且真的不是可以改变的东西。

      如果您同时拥有实例和原型方法,则实例方法隐藏原型方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多