Как вызвать унаследованный конструктор JavaScript с параметрами? - PullRequest
20 голосов
/ 30 августа 2010

Greetings,

После прочтения следующей статьи у меня возник вопрос: https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript

В примере наследования конструктор Person не принимает никаких параметров.Как бы выглядел этот пример, если бы я добавил его и вызвал из конструктора Student?

Спасибо!

Ответы [ 4 ]

38 голосов
/ 30 августа 2010

Итак, вы можете повторно использовать логику конструктора Person, вызывая его с помощью call или apply, например:

function Person(gender) {
  this.gender = gender;
}

function Student(gender) {
  Person.apply(this, arguments);
}
Student.prototype = new Person(); // make Student inherit from a Person object
Student.prototype.constructor = Student; // fix constructor property

var foo = new Student('male');
foo.gender;             // "male"
foo instanceof Student; // true
foo instanceof Person;  // true

Если вы хотите запретить выполнение конструктора Person, когда он вызывается без аргументов (как в строке: Student.prototype = new Person();), вы можете обнаружить его, например ::

function Person(gender) {
  if (arguments.length == 0) return; // don't do anything
  this.gender = gender;
}
9 голосов
/ 17 июля 2015

Принятый ответ кажется неверным.Исходя из того, что Mozilla говорит о OO JavaScript , правильный способ сделать это:

var Person = function(firstName) {
    this.firstName = firstName;
};

function Student(firstName, subject) {
  // Call the parent constructor, making sure (using Function#call)
  // that "this" is set correctly during the call
  Person.call(this, firstName);

  // Initialize our Student-specific properties
  this.subject = subject;
};

// Create a Student.prototype object that inherits from Person.prototype.
// Note: A common error here is to use "new Person()" to create the
// Student.prototype. That's incorrect for several reasons, not least 
// that we don't have anything to give Person for the "firstName" 
// argument. The correct place to call Person is above, where we call 
// it from Student.
Student.prototype = Object.create(Person.prototype); // See note below

// Set the "constructor" property to refer to Student
Student.prototype.constructor = Student;

// Example usage:
var student1 = new Student("Janet", "Applied Physics");

Как вы можете ясно видеть, Mozilla указывает, что распространенная ошибка - использовать «new Person»() ", чтобы создать Student.prototype.Следовательно, принятый ответ вводит в заблуждение.

Я на самом деле проверил это в своем текущем проекте, и путь Mozilla правильный, хотя приведенный выше ответ не работает.

0 голосов
/ 11 августа 2015

По всем другим комментариям я создал пример, который работает для меня.Поскольку я не использовал прототип в явном виде, я надеюсь, что я не пропустил важный момент.

0 голосов
/ 30 августа 2010
// define the Person Class
function Person(name) {
    this.personname = name;
}

Person.prototype.walk = function(){};
Person.prototype.sayHello = function(){
  alert (this.personname );
};

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor


Полный код:

<script>
// define the Person Class
function Person(name) {
    this.personname = name;
}

Person.prototype.walk = function(){};
Person.prototype.sayHello = function(){
  alert (this.personname );
};

// define the Student class
function Student() {}

// inherit Person
Student.prototype = new Person("test");

// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

// replace the sayHello method
Student.prototype.sayHello = function(){
  alert('hi, I am a student and my name is \'' + this.personname + '\'' );
}

// add sayGoodBye method
Student.prototype.sayGoodBye = function(){
  alert('goodBye');
}

var student1 = new Student();
student1.sayHello();
student1.sayGoodBye();
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...