Почему прототип рассматривается в объекте, а не в функции? - PullRequest
0 голосов
/ 05 июня 2018

Из этого MDN создается впечатление, что prototype является свойством Object, однако, похоже, что prototype является property из function вместо?

Учитывая приведенный ниже код, он набирает TypeReference

let Animal = {
  name: 'randomAnimal'
}

Animal.prototype.speak = function () {
  console.log(this.name + ' makes a noise.');
}

Чтобы заставить его работать, вместо объекта, мы изменим его на функцию вместо этого, как показано ниже

function Animal (name) {
  this.name = name;  
}

Animal.prototype.speak = function () {
  console.log(this.name + ' makes a noise.');
}

Мой вопрос больше касается попыток понять боевой дух или причину, по которой высказывание прототипа считается свойством объекта, хотя можно утверждать, что все функции являются объектами

1 Ответ

0 голосов
/ 05 июня 2018

Прототип является свойством объекта, а функции являются объектами первого класса.

Чтобы сделать объект параметризуемым во время создания экземпляра, мы можем создать объект с помощью функции конструктора, которая являетсяwrote:

function Animal (name) {
    this.name = name;  
}
Animal.prototype.speak = function() {
    console.log(this.name + " says hi!");
}
var lion = new Animal("lion");
lion.speak(); // "lion says hi!"

Здесь дается имя при построении объекта.

Но вы можете создавать объекты также с помощью инициализаторов объектов, например

let lion = { 
    name: "lion",
    speak: function() {
        console.log(this.name + " says hi!");
    }
}
lion.speak(); // "lion says hi!"

Естественно, этоэто проще с конструктором, особенно если у вас есть несколько свойств для инициализации и / или несколько похожих объектов для создания.

Третий способ создания объектов - это использование Object.create ().Он позволяет вам указывать объект-прототип при создании объекта, например:

var cat = Object.create(lion);
cat.name = "house cat";
cat.speak(); // "house cat says hi!"
console.log(lion.isPrototypeOf(cat)); // true

Для получения информации об объектах в JavaScript см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

Редактировать: но по умолчанию все функции имеют "Прототип "члена объекта, так как мы не знаем, должна ли функция использоваться в качестве конструктора.Объектные литералы или объекты, созданные с помощью Object.create (), не будут иметь его.

console.log(cat.prototype); //undefined

Что касается добавления объекта-члена-прототипа в литерал объекта, вопрос переполнения стека: Добавление прототипа клитерал объекта

...