2010-11-10 2 views
5

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

Почему существует String и String.prototype?

Если у меня есть "cat":

  • ли что String или Object?
  • Наследует ли он все свойства/методы от String или String.prototype?
  • Почему существует String и String.prototype?
  • Должен ли я называть String объектом String и String.prototype Строковый прототип?

Просьба внести ясность в это.

ответ

10

Я отвечаю на это, потому что есть много дезинформации в теме:

Это Строка или объект?

Нет"cat" является значением примитивной Строки:

typeof "cat"; // "string", a String value 
"cat" instanceof String; // false 


typeof new String("cat"); // "object", a String object 
new String("cat") instanceof String; // true 

я буду говорить позже о типах и примитивных значениях.

Наследует ли все свойства/методы от String или String.prototype?

Ну, когда вы используете property accessor operator (точку или кронштейн обозначения), то примитивное значение неявно преобразуется в объект, внутренне, поэтому все методы на String.prototype доступны, например:

Когда доступ:

"cat".chatAt(0); 

за кулисами "cat" преобразуется в объект:

Object("cat").chatAt(0); 

Вот почему у вас есть доступ ко всем унаследованным свойствам значений.

Почему существует String и String.prototype?

String является функцией конструкторы, позволяет создавать Струнные объекты или сделать преобразование типа:

var stringObj = new String("foo"); // String object 

// Type conversion 
var myObj = { toString: function() { return "foo!"; } }; 

alert(String(myObj)); // "foo!" 

String.prototype В объекте является объектом, где экземпляры объектов Струнных наследуют от.

Я знаю, что это сбивает с толку, мы имеем значения String и String, но большую часть времени вы на самом деле работаете только со строковыми значениями, не волнуйтесь сейчас о объектах String.

Должен ли я назвать String объектом String и String.prototype прототипом String?

Вы должны позвонить по телефону String"The String constructor".

«Строковый прототип» в порядке.

Вы должны знать, что «Все есть NOT объект».

Давайте поговорим о типов, Есть пять language types указано:

  • Строка
  • Номер
  • Boolean
  • Null
  • Неопределенное

A primitive value - это «данность, которая представлена ​​непосредственно на самом низком уровне реализации языка», простейшая часть информации, которую вы можете получить.

Значения описанных выше типов могут быть:

  • Нуль: Значение null.
  • Undefined: Значение undefined.
  • Номер: Все номера, такие как 0, 3.1416, 1000 и т. Д. Также NaN и Infinity.
  • Boolean: Значения true и false.
  • Строка: Каждая строка, такая как "cat" и "bar".
+0

Я согласен с вами с «строкой» и новой разницей String(), я признаю, что я этого не знал. Но я не согласен с частью данных и объектов.Возможно, строки, булевы и числа - это не объекты, но они представлены как объекты в JS, и если вы делаете что-то вроде String instanceof Object, результат будет истинным. – mck89

+0

@ mck89, я имел в виду, что примитивное значение - это самая простая часть данных, которую вы можете иметь, да, вы можете «обрабатывать их как объекты» (например, доступ к унаследованным свойствам, «foo» .chatAt' или '5 .. toFixed'), но они по-прежнему таковы, что значения, а не объекты. О 'String instanceof Object' очевидна, потому что' String' является * объектом Function *, который наследуется от 'Function.prototype', который наследуется от' Object.prototype', поэтому 'String instanceof Function 'даст вам также' true '. – CMS

3

Строки - объекты в JavaScript. Нет реального типа данных, называемого строкой, как на PHP, C или на других языках.

String.prototype представляет собой конструкцию, которая добавляет функциональность всем вашим String-Objects. Если вы хотите, чтобы все строки, чтобы предложить, например, функцию преобразования выполнить следующие действия:

String.prototype.convert = function() { 
    // Put your code in here 
} 

// Set up y new String 
var example = "cat"; 

// Now you can call your function 
example.convert(); 
+1

Неправильно, JavaScript имеет тип String, '' cat ''является [** примитивным значением **] (http://bclary.com/2004/11/07/#a-4.3. 2). JavaScript может иметь также * String objects *, но концепция отличается, они просто обернуты примитивами, например. 'alert (typeof" foo "); // "string" ',' alert (typeof Object ("cat")) // "object" '. Проверьте [мой ответ] (http://stackoverflow.com/questions/4142230/prototypes-in-javascript/4142624#4142624). – CMS

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