Как использовать один и тот же метод при связывании объекта? - PullRequest
3 голосов
/ 23 ноября 2011
var string = function (base) { 
  return { 
    add: function (added) {
      return base + added;
  }
 }
}

text = string("robots").add(" are awesome");

console.log(text);

// robots are awesome

text2 = string("robots").add(" are awesome").add(" everytime!");

console.log(text2);

// TypeError: Object robots are awesome has no method 'add'

Как мне сделать эту работу?Что вы можете сделать, чтобы разделить метод add для определенных объектов в рамках функции?

Ответы [ 5 ]

2 голосов
/ 23 ноября 2011

Если вы вернете только string(base + added).Это не будет работать должным образом.Он вернет объект, когда вы console.log.

var string = function (base) { 
  return { 
    add: function (added) {
      return string(base + added);
  }
 }
}
console.log(string("test ").add("this ").add("thing"));
// outputs [object Object]

Приведенный выше пример потерпит неудачу для того, что вы хотите.Вы можете попробовать это:

var string = function (base) { 
  return { 
    add: function (added) {
      base += added;
      return string(this.toString());
    },
   toString: function() {
      return base;
    }
 }
}

console.log(string("test ").add("this ").add("thing").toString());
// outputs "test this thing"

Это выведет правильно.

Вы также можете расширить String.prototype и добавить метод add.

1 голос
/ 23 ноября 2011

Это может быть достигнуто с функциональным наследованием и каскадированием.Именно для этого, кажется, и нужен ОП.Нет псевдоклассического наследования.

var string = function (someStartString) {
    var that = {
        append: function (newString) {
              that.currentString += newString;
              return that;//enable cascades        
        }
        ,currentString: someStartString
     };
     return that;
}

Примеры вызовов

var textObj = string("robots").append(" are awesome");

console.log(textObj.currentString);//output: robots are awesome

// robots are awesome

var text2Obj = string("robots").append(" are awesome").append(" everytime!");

console.log(text2Obj.currentString);//output: robots are awesome everytime!
0 голосов
/ 23 ноября 2011

Вы можете сделать что-то вроде:

var string = function (base) { 
  return { 
    add: function (added) {
      return string(base + added);
    },
    toString: function() {
      return base;
    }
 }
}

Редактировать: вы также можете добавить метод toString.

0 голосов
/ 23 ноября 2011

Вы возвращаете простую строку, а не экземпляр вашего конструктора. Для простых строк .add недоступно.

Вы можете решить эту проблему, возвращая новый экземпляр, чтобы функция .add была доступна для результата:

return string( base + added );

Тогда это в основном выглядит так:

string("robots").add(" are awesome").add("everytime!");
string("robots are awesome").add("everytime!");
string("robots are awesomeeverytime!");

вместо:

string("robots").add(" are awesome").add("everytime!");
"robots are awesome".add("everytime!");
<error>
0 голосов
/ 23 ноября 2011

Вы хотите вернуть string из вашей функции add:

var string = function (base) { 
  return { 
    add: function (added) {
      return string(base + added);
  }
 }
}
...