2016-03-31 2 views
1

Javascript новая функция конструктор не возвращает требуемое значение

function Add(a, b){ 
 
\t this.a = a, this.b = b; 
 
\t return this.a + this.b; 
 
} 
 

 
var add5 = new Add(2, 3); \t // ? add5 = 5 
 

 
console.log(add);

"TypeOf add5" является объект, и "add5 InstanceOf Добавить" верно.

Мой вопрос:

  1. В этом случае, как я могу вернуть значение 5, который я хочу?
  2. В функции Добавить, я явно возвращаю 5, почему я возвращаю экземпляр Add?
  3. Включает ли новый объект Function() только этот экземпляр?
+0

Почему вы используете 'new', если вы, кажется, не хотят, чтобы создать объект? –

ответ

1

Разве это намного проще ...

function Add(a, b){ 
      return a + b; 
} 

var add = Add(2, 3); // ? add = 5 
console.log(add); 

Или, может быть, если вы хотите метод, связанный Instance

function AddNumbers(a, b){ 
    this.a = a; 
    this.b = b; 
    return this; 

} 
AddNumbers.prototype.add = function(){ 
     var sum = this.a+this.b; 
     console.log(sum); 
     return sum; 
} 

var addObject = new AddNumbers(2, 3); // ? add = 5 
addObject.add(); 
+0

Это хорошее решение для первого вопроса, спасибо. – soarinblue

2

1. В этом случае, как могу ли я вернуть значение 5, которое я хочу?

С простой функцией и с прямым вызовом без оператора new.

function add(a, b) { 
 
    return a + b; 
 
} 
 

 
document.write(add(2, 3));

2. В функции Add, я явно возвращать 5, почему я получаю возврат Добавить экземпляр?

3. Не возвращает ли новый объект() только этот экземпляр?

Вы получаете экземпляр из-за new operator.

3. Объект, возвращаемый функцией-конструктором, становится результатом всего нового выражения. Если функция конструктора явно не возвращает объект, вместо этого используется объект, созданный на шаге 1. (Обычно конструкторы не возвращают значение, но они могут выбрать, чтобы сделать это, если они хотят, чтобы переопределить процесс создания объекта нормальный.)

Согласно this, новый экземпляр не возвращает primitive data type. Вы можете только перезаписать возвращаемое значение() с помощью объекта.

+0

_ (Обычно конструкторы не возвращают значения, но они могут сделать это, если они хотят переопределить процесс создания обычного объекта.) _ У меня есть сомнения в этой строке. Тогда почему он не возвратил значение в случае OP? –

+0

Это ответ на второй, третий вопрос, спасибо большое. – soarinblue

+0

@RajaprabhuAravindasamy: Потому что возвращаемое значение не было объектом. –

0

Вы должны удалить «новое» ключевое слово, так как это создает новый объект из этой функции. Просто вызовите функцию следующим образом.

function Add(a, b){ 
 
\t this.a = a, this.b = b; 
 
\t return this.a + this.b; 
 
} 
 

 
var add = Add(2, 3); \t // ? add = 5 
 

 
console.log(add);

+0

Это ответ на первый вопрос, спасибо. – soarinblue

1

Новый оператор используется для создания объекта. В вашем случае add5.a и add5.b заполнены 2 и 3 соответственно.

Вы должны сделать следующее.

function Add(a, b){ 
    this.a = a, this.b = b; 
    this.result = function(){ 
     return this.a + this.b; 
    } 
} 

и использовать его как

var add5 = new Add(2, 3); // ? add5 = 5 

console.log(add5.result()); 
+0

Это умный трюк для первого вопроса, спасибо. – soarinblue

Смежные вопросы