Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 11.01.2013, 13:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от platedz
а мне нужно получить только
a: a
b: b
Как этого добиться?
Object.prototype.forin = function(){var result = ""; for(i in this) {if (!this.hasOwnProperty(i)) continue;result += i + ": "+this[i] +"\n"} return result;}
var ob = {a:"a",b:"b"}
alert(ob.forin());
Ответить с цитированием
  #12 (permalink)  
Старый 11.01.2013, 13:47
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо, т.е. если я правильно понимаю, то forin выводится т.к. он является как бы предопределенным свойством для всех Объектов.
ob -> Object.prototype.
Неясно только по-какому правилу не выводятся предопределенные свойства Object., навроде скажем call, или bind. Ведь они тоже являются свойствами Object.prototype?
Ответить с цитированием
  #13 (permalink)  
Старый 11.01.2013, 14:56
Аспирант
Отправить личное сообщение для Sanda Посмотреть профиль Найти все сообщения от Sanda
 
Регистрация: 12.10.2012
Сообщений: 90

Я на всякий случай повторюсь - НЕ НАДО добавлять базовым сущностям новые методы. Единственное исключение - методы, включённые в стандарт, но не поддерживаемые старыми браузерами.
Ответы на первый и второй вопрос - нет (по крайней мере, мне сей способ неизвестен). У методов и полей есть скрытое свойство enumerable, отвечающее за то, будет ли данный метод считаться в for..in-цикле. У стандартных объектов все предопределённые методы имеют enumerable = false.
Ответ на третий вопрос. Вернее, сначала комментарий. Именно поэтому и не надо расширять стандартные объекты - порой случаются неожиданные казусы вроде этого (: Касаемо же вывода - нужно взять за правило в любом for..in ставить проверку hasOwnProperty для отсечения "привнесённых" методов/полей.

var greeter = function () {};
//свойство в прототипе родителя
greeter.prototype.greet = function() {alert('Hello');};

var byer = new greeter();
//собственное свойство потомка
byer.bye = function () {alert('Bye'); };

var result1 = "With hasOwnProperty:\n";
for (key in byer){
  if (byer.hasOwnProperty(key)) {
    result1 += key + ': ' + byer[key].toString() + "\n";
  }
}

alert(result1); //выводит только собственные свойства объекта

result2 = "Without hasOwnProperty:\n";
for (key in byer){
  result2 += key + ': ' + byer[key].toString() + "\n";
}

alert(result2); //выводит все enumerable=true свойства объекта
Ответить с цитированием
  #14 (permalink)  
Старый 11.01.2013, 15:16
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за пояснение, только все-таки мне немного не ясно, а что же тогда это

alert(Object.prototype.constructor.__proto__.apply);
Ответить с цитированием
  #15 (permalink)  
Старый 11.01.2013, 15:37
Аспирант
Отправить личное сообщение для Sanda Посмотреть профиль Найти все сообщения от Sanda
 
Регистрация: 12.10.2012
Сообщений: 90

А это добрый дядя FF (ну или там Chrome) раскрывает скрытый prototype через __proto__. Попробуйте запустить, например, в IE8.
Ну или я не понял вопроса. Вообще, судя по коду, это стандарный Function.prototype.apply, вытащенный через одно место.
alert(Function.prototype.apply === Object.prototype.constructor.__proto__.apply);
Ответить с цитированием
  #16 (permalink)  
Старый 11.01.2013, 15:59
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

С proto я понял, но оно, кстати, сработало везде кроме ie8, более поздних версий под рукой не было.

Если в хроме набрать Object.prototype, то можно посмотреть все свойства и методы ему свойственные. Так вот, если задать метод через

Object.prototype.apply =

то в у меня появляется новый метод apply
А если сделать, при этом если проследить цепочку, то старый метод сохраняется, но его можно изменить так

Object.prototype.constructor.__proto__.apply =

При этом согласно
http://learn.javascript.ru/classes#...-в-javascript

Я ожидал что

Function.prototype.apply, должна находится внизу цепочки,

Как же оно все на самом деле то?
Ответить с цитированием
  #17 (permalink)  
Старый 12.01.2013, 00:01
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Подскажите, функция
Function.prototype.bind - эмулирует свойство, но при этом будет доступно при переборе свойств через for in.
Также будут доступны свойства вновь созданные свойства в Object.prototype.
При этом свойства Function.prototype и все свойства Object.prototype будут доступны при переборе любого конструктора.
А что если мне нужно сэмулировать bind, но мне эти свойства не нужны. Могу я засунуть в какую-то свою функцию-конструктор, MyFunction.prototype к примеру и использовать ее как обычный bind?
Ответить с цитированием
  #18 (permalink)  
Старый 12.01.2013, 00:46
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

А самое главное могу ли я как-то объединить по принципу прототипов две замкнутые функции т.е.

Есть функция конструктор

a1 = new function(i){

function a_privar(e) { return "a_privat"; }
return {
aa:  function (d) { alert(d+a_privar()+(++i));}

}

}(3)

a1.aa("0-");


Мне нужно расширить функцию функцией b1

b1 = function(){

function b_privat(e) { return "b_privat"; }
return {
bb:  function (d) {alert(d+b_privat()+(++ii)); }

}}()


Как это сделать?
Ответить с цитированием
  #19 (permalink)  
Старый 12.01.2013, 03:33
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Object.defineProperty(Object.prototype, 'prop1', {enumerable: true,value: 'bla1'})

Object.defineProperty(Object.prototype, 'prop2', {enumerable: false,value: 'bla2'})

for (var prop in Object.prototype) alert(prop);
Ответить с цитированием
  #20 (permalink)  
Старый 12.01.2013, 12:41
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо, но этот метод к сожалению не для Ie8.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что такое "клиентская библиотека"? jsuse Общие вопросы Javascript 3 27.04.2012 01:50
Что такое class и для чего они нужны нуб Общие вопросы Javascript 6 29.11.2011 23:31
фрактальный сыр x-yuri Оффтопик 76 23.11.2011 21:59
Браузер доказывает что не видит функцию SleepWalker Общие вопросы Javascript 7 17.06.2009 23:14
Что такое "javascript:document.login.submit()" i_live_in_Moscow Общие вопросы Javascript 21 30.09.2008 15:25