如何在对象内的函数内部进行原型工作?

时间:2017-05-10 10:44:42

标签: javascript function object prototype

我需要帮助来修复示例3中的代码。由于此引用,我无法对如何使原型工作进行排序。我知道这是对本地范围的引用,但即使创建一个var keep = this来传递它在原型中失败的引用:

//exemplo 1
var m1=function(){
    this.a=null;
    this.b=null;
    if (typeof this.fr !== "function") {
        m1.prototype.fr = function (obp) {
          var propriedade;
          for (propriedade in obp) {
        if (obp.hasOwnProperty(propriedade)) {
          this[propriedade]=obp[propriedade];
        }
          }
          return this;                
        }
    }
}

var t2=new m1().fr({"a":"eee"}); //works!
console.log(t2);


//exemplo 2
var m1=function(obp){
    this.a=null;
    this.b=null;
    if (typeof this.fr !== "function") {
        m1.prototype.fr = function () {
          var propriedade;
          for (propriedade in obp) {
        if (obp.hasOwnProperty(propriedade)) {
          this[propriedade]=obp[propriedade];
        }
          }
          return this;                
        }
    }
}

var t2=new m1({"a":"eee"}).fr(); //works!
console.log(t2);

//exemplo 3

var o1={
    m1:function(){
        var m1=this;
        this.a=null;
        this.b=null;
        if (typeof this.fr !== "function") {
            this.prototype.fr = function (obp) { //fails here
              var propriedade;
              for (propriedade in obp) {
                if (obp.hasOwnProperty(propriedade)) {
                  thia[propriedade]=obp[propriedade];
                }
              }
              return this;                
            }
        }
    }
}
var t2=new o1.m1().fr({"a":"eee"}); //fails!
console.log(t2);

根据Karim回答固定:

//exemplo 1
var m1=function(){
    this.a=null;
    this.b=null;
    if (typeof this.fr !== "function") {
        m1.prototype.fr = function (obp) {
          var propriedade;
          for (propriedade in obp) {
        if (obp.hasOwnProperty(propriedade)) {
          this[propriedade]=obp[propriedade];
        }
          }
          return this;                
        }
    }
}

var t1=new m1().fr({"a":"eee"});
console.log(t1);


//exemplo 2
var m2=function(obp){
    this.a=null;
    this.b=null;
    if (typeof this.fr !== "function") {
        m2.prototype.fr = function () {
          var propriedade;
          for (propriedade in obp) {
        if (obp.hasOwnProperty(propriedade)) {
          this[propriedade]=obp[propriedade];
        }
          }
          return this;                
        }
    }
}

var t2=new m2({"a":"eee"}).fr();
console.log(t2);

//exemplo 3

var o1={
    m1:new m1()
}
var t3=o1.m1.fr({"a":"eee"});
console.log(t3);

1 个答案:

答案 0 :(得分:2)

这是你的代码:

var o1={
    m1:function(){
        var m1=this;
        this.a=null;
        this.b=null;
        if (typeof this.fr !== "function") {
            this.prototype.fr = function (obp) { //fails here
              var propriedade;
              for (propriedade in obp) {
                if (obp.hasOwnProperty(propriedade)) {
                  thia[propriedade]=obp[propriedade];
                }
              }
              return this;                
            }
        }
    }
}

您尝试从当前prototype访问this,其中对象方法内部是当前实例。

但是当前实例是对象文字o1)而prototype对象意味着要用于构造函数在这种情况下没有。

尝试为o1创建构造函数,然后在if语句中引用设置原型的函数