2013-07-06 4 views
1

Я пытаюсь преобразовать java-код в javascript (js), и я очень расстроен тем, как js не хватает многих строковых методов. Я знаю js строковые библиотеки и что вы можете сделать someString.length, чтобы получить длину строки. Но я был приятно удивлен, увидев в верхнем ответ на эту тему: How to check if a string "StartsWith" another string? Это метод StartsWith может быть определен в моем JS файл кода, как так:Как определить функцию javascript string.length()?

if (typeof String.prototype.startsWith != 'function') { 
    String.prototype.startsWith = function (str){ 
    return this.indexOf(str) == 0; 
    }; 
} 

Так что я пытался сделать что-то подобное для метод длина:

if (typeof String.prototype.length != 'function') { 
    String.prototype.length = function(){ 
    return this.length; 
    }; 
} 
var str = "a string"; 
alert(str.length()); 

Но это не работает, я получаю следующее сообщение об ошибке в хроме при попытке позвонить: Uncaught TypeError: Property «длина» объекта не функция

Кто-нибудь знает, почему я не могу создать функцию length() аналогично тому, как это можно сделать для метода startsWith (str), описанного выше? Спасибо, Keith

+3

Почему вы хотите, чтобы превратить существующее свойство в метод? – delnan

+0

Мэтту Джонсону и дельнану: Спасибо, но я знаю об этом, как указано в моем посте. Я пытаюсь определить его как функцию, чтобы я мог вырезать и вставлять свой java-код в js, не заставляя себя перекодировать вещи. ура – keithphw

+4

Очень плохая идея. Это не будет летать для большинства кода. Языки слишком разные. Также обратите внимание, что это (если бы оно сработало для начала) сломало бы * код другого пользователя *. – delnan

ответ

9

экземпляры строк создаются с неизменяемой length имущества, не унаследованный от String.prototype. Таким образом, вы не сможете создать метод length() для строк.

См http://ecma-international.org/ecma-262/5.1/#sec-15.5.5

String instances inherit properties from the String prototype object and their [[Class]] internal property value is "String". String instances also have a [[PrimitiveValue]] internal property, a length property, and a set of enumerable properties with array index names.

И посмотреть http://ecma-international.org/ecma-262/5.1/#sec-15.5.5.1

Once a String object is created, this property is unchanging. It has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

+0

Спасибо за указатель NagaJolkia, интересные exceprts из спецификации.Но я до сих пор не понимаю, как факт, что длина является свойством, означает, что я не могу получить к нему доступ с помощью функции length(). cheers, – keithphw

+2

Методы @keithphw также являются свойствами. У них нет отдельного пространства имен, если это то, о чем вы думаете. Функции являются объектами в JavaScript и сохраняются как свойства так же, как и любое другое значение. – 1983

+0

Спасибо NagaJolokia, я не знал об этом. Поэтому, когда я пытаюсь определить новый метод с именем length, он сталкивается с свойством length, потому что они оба являются свойствами. Теперь я понимаю. Большое спасибо за ваш быстрый ответ. Приветствия, keith – keithphw

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