Какой звук прототипы в языке сценариев JavaScript, и зачем они служат?

Мне хотелось бы знать, что прототипы в языке сценариев JavaScript, и как я могу использовать их, или если существует какой-то тип благодеяния.

10
задан 04.01.2016, 05:34
3 ответа

Как начальное замечание, POO JavaScript она является основанной на прототипах и не на классах. Чтобы видеть больше информации на prototype-based OOP vrs. class-based OOPты можешь посещать следующее соединение (на английском).

Прототипы - набор процедуры, чтобы объединять Программирование, Ориентируемое на Объекты в JavaScript. Тогда, продолжая эти правила мы должны быть способны создавать различную методологию Ориентации в Объекты:

  • Наследство
  • Encapsulamiento
  • Абстракция
  • Полиморфизм

Конечно, не все методология доступна.

Как я могу использовать прототипы?

ECMAScript 5

Чтобы создавать класс:

function Polygon(height, width){
  this.height = height;
  this.width = width;
}

Чтобы получать в наследство на базовом классе:

function Square(side){
  this.prototype = Object.create(Polygon.prototype);
  Polygon.call(this, side, side);

  this.getArea = function(){
    return this.height * this.width;
  }
}

ECMAScript 6

Чтобы создавать класс:

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

Чтобы получать в наследство базового класса:

class Square extends Polygon {
  constructor(side) {
    super(side, side);
  }
  getArea() {
    return this.height * this.width;
  }
}

Уже с этим мы можем создавать инстанцию с:

var square = new Square(5);
// debe imprimir 25
console.log(square.getArea());

Взятые примеры Inheritance and the prototype chain.

Прибыль

  • Располагать программированием высокого уровня.
  • Располагать различными способами создавать объекты.
  • Иметь наследство в свойствах и методах.
  • Главным образом прибыль располагения прототипами в JavaScript это возможность использовать Программирование, Ориентируемое на Объекты как методология Программного обеспечения.
9
ответ дан 24.11.2019, 15:01
  • 1
    В примере ES5, ты инициализировал поля width и height прямо, не называя строителя прототипа. Но возможно, что у этого строителя есть м и # 225; s l и # 243; gico, что был dif и # 237; cil†”или в и # 250; n невозможный (если есть у ссылки на closure, что уже не est и # 225; доступный). и #191; возможно называть строителя базового класса в ES5? и и #191; c и # 243; mo? – wchargin 04.01.2016, 08:48
  • 2
    @WChargin Я Соглашаюсь с тобой, строитель для ES5, кажется, не имеет l и # 243; gica, решать это и # 233; как можно раньше. – learnercys 04.01.2016, 09:04
  • 3
    @WChargin Каждый funci и # 243; n в JavaScript у него есть м и # 233; совсем call. С этим ты можешь называть строительного отца для reutilizaci и # 243; n c и # 243; я говорю. Снабжает ссылками . Я только что изменил пример используя м и # 233; совсем call. – learnercys 04.01.2016, 16:20
  • 4
    Кратко this - то, что дифференцирует класс funci и # 243; n, верный? – Javier Cárdenas 04.01.2016, 17:21
  • 5
    @JavierC и # 225; rdenas не обязательно, this может использоваться даже, не будучи внутри funci и # 243; n или класс. Ваше поведение или стоимость зависит c и # 243; mo она названа. Например, в случае когда он использует this в глобальной среде, this представляет window, в случае когда используется под expresi и # 243; n new, представляет инстанцию настоящего объекта. Тогда, в t и # 233; rminos личные детали, представь scope настоящий. М и # 225; s informaci и # 243; n . – learnercys 04.01.2016, 17:56

У всех объектов в языке сценариев JavaScript есть специальное так называемое свойство prototype что является ссылкой на другой объект.

Зачем он полезный?, давайте видеть пример:

var miObjeto = {
  foo: 5
}
console.log(miObjeto.foo); // 5

Здесь давайте верить в так называемый объект miObjeto, мы определяем свойство foo со стоимостью 5 и мы печатаем стоимость этой переменной. Ясно результата 5, но: что происходит, когда у объекта нет переменной foo?. Язык сценариев JavaScript будет стараться находить ее в prototype этого объекта, и я схватил последовательно до тех пор, пока он не найдет ее или прибудет в конце цепи прототипа.

Эта цепь прототипа позволяет нам симулировать наследство (давайте помнить, что в языке сценариев JavaScript не существует наследство, основанное на классах), если мы хотим добавить методы или свойства к объекту, мы можем делать это посредством prototype.

Давайте считать следующую функцию Persona:

function Persona(nombre, edad) {
  this.nombre = nombre;
  this.edad = edad;
}

Прототип этой функции Persona.prototype и мы можем добавлять ему больше методов или свойств тех, которые у него есть оригинально:

Persona.prototype.toString = function() {
  return "[Persona: " + this.nombre + "]";
}

Persona.prototype.saludar = function() {
  console.log("Hola mi nombre es: " + this.nombre);
}

Сейчас мы будем создавать объект p типа Persona с new, - эта точка прототип p он равен Persona.prototype:

var p = new Persona("John", 33);
console.log(p.nombre); // propiedad del objeto
console.log(p.toString()); // propiedad no encontrada directamente en el objeto

По этой причине призвав метод toString несмотря на то, что это не прямой метод p, Язык сценариев JavaScript ищет в прототипе p и да он это находит и все функционирует правильно.

В любом моменте мы можем консультировать прототип объекта с Object.getPrototypeOf, для нашего особенного случая:

Object.getPrototypeOf(p) === Persona.prototype; // true

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

6
ответ дан 24.11.2019, 15:01

Прототипы - объекты, у которых могут быть свойства (функционируй и mГ©todos), кроме того могут быть использованными другими объектами, чтобы получать в наследство Ваши свойства, это Гєtil очень, чтобы герметизировать в корпусе и повторно использовать cГіdigo, это дает тебе возможность приспосабливать твой cГіdigos в diseГ±o ориентируемая объекты.

В языке сценариев JavaScript совсем, что это не были примитивные типы (undefined, null, boolean, number или string) - объекты и могут быть использованными как прототипы, чтобы создавать другие объекты.

2
ответ дан 24.11.2019, 15:01

Теги

Похожие вопросы