如何将方法附加到函数的方法

时间:2018-03-22 18:26:58

标签: javascript function object methods prototype

示例:

var A = function (z) {
  this.z = z
}

// attach 1 method

A.prototype.sayHay = function(message) {
  this.message = message
  console.log(message)
}

// attach 2 methods ?????
A.prototype.sayHay.protorype.inReverse = function () {

  // how to avoid the first console.log
  console.log(this.message.split('').reverse().join(''))
}

var b = new A()

b.sayHay('Hola').inReverse()

// this should prints 'aloH'

我怎么能覆盖第一个console.log,因为sayHay打印'Hi'并返回inReverse'iH'

E D I T E D - - - - - - - - - - - - - - - - - - - - - - - - - - -

我怎么办,只执行sayHay('Hola')我返回'Hello'并执行sayHay('Hello')。inReverse()返回'aloH'?

3 个答案:

答案 0 :(得分:1)

var A = function (z) {
  this.z = z
}

// attach 1 method

A.prototype.sayHay = function(message) {
  this.message = message;
  return {
    log : function(){console.log(message)},
    rev : function () { console.log(this.message.split('').reverse().join(''))}
  };
}

var b = new A();

b.sayHay('Hola').rev();

// this should prints 'aloH'

我试图以封闭的方式来做。检查您是否对通过原型和闭合组合实现目标感到满意。

答案 1 :(得分:0)

原型用于使用关键字new创建对象的情况。

例如:

new A().sayHay(...).[Any method from the prototype]

因此,您可以初始化变量b,然后执行函数sayHay作为构造函数:

new b.sayHay('Hola').inReverse();



var A = function (z) {
  this.z = z
}

// attach 1 method
A.prototype.sayHay = function(message) {
  this.message = message
  //console.log(message);
}

A.prototype.sayHay.prototype.inReverse = function () {
  // how to avoid the first console.log
  console.log(this.message.split('').reverse().join(''))
}

var b = new A();
new b.sayHay('Hola').inReverse();




要避免第一个console.log(message),您可以在运行时替换该函数,或删除该行。

另一种选择是避免第二次原型设计并返回一个对象:



var A = function (z) {
  this.z = z
}

// attach 1 method
A.prototype.sayHay = function(message) {
  return {
    message: message,
    inReverse: function() {
      console.log(this.message.split('').reverse().join(''));
    }
  }
}

var b = new A();
b.sayHay('Hola').inReverse();




答案 2 :(得分:0)

这是使用常规类的另一种方式

class Sayer {
  constructor (message) {
    this.message = message
  }
  
  inReverse() {
    return this.message.split('').reverse().join('')
  }
  
  toString() {
    return this.message   
  }
}

class A {
  sayHay(message) {
     return new Sayer(message)
  }
}

console.log(new A().sayHay('Hola').inReverse())
console.log(new A().sayHay('Hola').toString())