Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   функция копирования свойств (https://javascript.ru/forum/misc/4668-funkciya-kopirovaniya-svojjstv.html)

zzz 12.08.2009 14:14

функция копирования свойств
 
Сорри за стоко тем но прошу обьяснить новичку
Непонятны некоторые куски кода
// копирует все свойства из src в dst,
// включая те, что в цепочке прототипов src до Object
function mixin(dst, src){
    // tobj - вспомогательный объект для фильтрации свойств,
    // которые есть у объекта Object и его прототипа
    var tobj = {} 
    for(var x in src){
        // копируем в dst свойства src, кроме тех, которые унаследованы от Object
        if((typeof tobj[x] == "undefined") || (tobj[x] != src[x])){
            dst[x] = src[x];
        }
    }
    // В IE пользовательский метод toString отсутствует в for..in
    if(document.all && !document.isOpera){
        var p = src.toString;
        if(typeof p == "function" && p != dst.toString && p != tobj.toString &&
         p != "\nfunction toString() {\n    [native code]\n}\n"){
            dst.toString = src.toString;
        }
    }
}

А именно
if((typeof tobj[x] == "undefined") || (tobj[x] != src[x]))

То есть копируются только те свойства и методы которые имеют тип undefined. И какой смысл в них? и те которые не равны src[x]. Вот тут вообще запутался копирование же и идёт из src а tobj вообще пустой обьект.
А также
// В IE пользовательский метод toString отсутствует в for..in
    if(document.all && !document.isOpera){
        var p = src.toString;
        if(typeof p == "function" && p != dst.toString && p != tobj.toString &&
         p != "\nfunction toString() {\n    [native code]\n}\n"){
            dst.toString = src.toString;
        }
    }
Тут тоже не понятно toString вроде до этого и не использовался и вообще что этот кусок кода делает.

Kolyaj 12.08.2009 14:44

Цитата:

Сообщение от zzz
То есть копируются только те свойства и методы которые имеют тип undefined.

На названия переменных внимание обратите.

Цитата:

Сообщение от zzz
Вот тут вообще запутался копирование же и идёт из src а tobj вообще пустой обьект.

http://javascript.ru/tutorial/object отсюда статьи прочитали уже? Про прототипное наследование поняли? Нет, так читайте уже.

Цитата:

Сообщение от zzz
Тут тоже не понятно toString вроде до этого и не использовался и вообще

А где он должен был использоваться?

Цитата:

Сообщение от zzz
и вообще что этот кусок кода делает.

Копирует.

zzz 12.08.2009 14:49

Читал про прототипы понял. Это метод объекта который добавляет новые методы и свойства.
Ну там написано что в ИЕ нету toString тогда вообще зачем этот кусок кода

Kolyaj 12.08.2009 14:56

Цитата:

Сообщение от zzz
Ну там написано что в ИЕ нету toString тогда вообще зачем этот кусок кода

Вы просто не умеете читать.
Цитата:

Сообщение от zzz
// В IE пользовательский метод toString отсутствует в for..in


zzz 12.08.2009 15:05

Я это и иммел ввиду ведь этот кусок кода должен работать если браузер ИЕ почему?

Kolyaj 12.08.2009 15:11

Потому что в IE пользовательский метод toString отсутствует в for..in. Что непонятно-то?

zzz 12.08.2009 15:12

Но он же до этого там и не использовался так какая разница есть он в ИЕ или нету

Zeroglif 12.08.2009 15:15

JScript DontEnum Bug

zzz 12.08.2009 15:16

У меня с английским не очень

zzz 12.08.2009 15:17

(tobj[x] != src[x])
Это чтобы не копировались стандартные методы обьекта?
typeof tobj[x] == "undefined")
А это проверка есть такой метод вТобдж если нету значит не стандартный?
p.s. стандартные методы==методы которые и так есть у всех обьектов

B~Vladi 12.08.2009 16:30

zzz, проспись хорошенько:)

zzz 12.08.2009 16:30

А что не так?
Проверка чтобы не копировались свойства которые и так есть у всех обьектов
разве я не прав?

B~Vladi 12.08.2009 16:39

Цитата:

Сообщение от zzz
А что не так?

Да всё так... Просто когда отдохнувший, лучше начинает доходить и как результат - крепкие нервы у тебя и у нас:)

зы: не насилуй свой моск...

zzz 12.08.2009 16:41

Когда я отдохнувший меня в КС тянет)

zzz 12.08.2009 17:47

Осталось не понятно только условие
if(typeof p == "function" && p != dst.toString && p != tobj.toString &&
         p != "\nfunction toString() {\n    [native code]\n}\n"){

Kolyaj 12.08.2009 17:57

И что тут непонятного?

zzz 12.08.2009 18:01

Ну вроде P должно быть в формате строки из-за toString а тут ==function должно быть раз, во вторых повторюсь зачем весь этот кусок кода(ведь он только для ИЕ) а также
p != "\nfunction toString() {\n    [native code]\n}\n"
что это вообще значит

Kolyaj 12.08.2009 18:13

Цитата:

Сообщение от zzz
Ну вроде P должно быть в формате строки из-за toString

toString не вызывается, а присваивается (я ж говорю, читать не умеешь).

Цитата:

Сообщение от zzz
зачем весь этот кусок кода(ведь он только для ИЕ)

Так для ИЕ и нужен.

Цитата:

Сообщение от zzz
что это вообще значит

Ну попробуй уже наконец
alert({}.toString)
Так и будешь на каждый чих в форум писать?

zzz 12.08.2009 18:18

Цитата:

Сообщение от Kolyaj
Сообщение от zzz
зачем весь этот кусок кода(ведь он только для ИЕ)
Так для ИЕ и нужен.

ППЦ что он делает-то (что копирует это понятно) я имею ввиду почему для ИЕ не хватает обычного кода почему нужно ещё это дополнение

Цитата:

Сообщение от Kolyaj
я ж говорю, читать не умеешь

Читать я умею
Всё равно Р равно src в формате строки значит и Р это строка (поправте если я не прав)
И что такое [native code]

Цитата:

Сообщение от Kolyaj
Так и будешь на каждый чих в форум писать?

Если бы я на каждый чих писал форум был бы весь в моих сообщениях а тут мне реально не понятно

Kolyaj 12.08.2009 18:25

Цитата:

Сообщение от zzz
почему для ИЕ не хватает обычного кода почему нужно ещё это дополнение

Zeroglif уже дал ссылку, смотреть раздел JScript DontEnum Bug.

Цитата:

Сообщение от zzz
Всё равно Р равно src в формате строки значит и Р это строка

Может жирным надо написать: toString не вызывается. Это toString() строка, а toString обычно функция.

Цитата:

Сообщение от zzz
И что такое [native code]

Уже запустил, что я написал?

zzz 12.08.2009 18:28

Цитата:

Сообщение от Kolyaj
Сообщение от zzz
почему для ИЕ не хватает обычного кода почему нужно ещё это дополнение
Zeroglif уже дал ссылку, смотреть раздел JScript DontEnum Bug.

Там по английски я не понимаю

Цитата:

Сообщение от Kolyaj
Сообщение от zzz
Всё равно Р равно src в формате строки значит и Р это строка
Может жирным надо написать: toString не вызывается. Это toString() строка, а toString обычно функция.

И что делает эта фнкция тогда

Kolyaj 12.08.2009 18:31

Цитата:

Сообщение от zzz
Там по английски я не понимаю

Там достаточно код и результаты в разных браузерах посмотреть.

Цитата:

Сообщение от zzz
И что делает эта фнкция тогда

Ничего она не делает. Чтобы функция что-то делала, нужно ее вызвать, а тут она не вызывается.

zzz 12.08.2009 18:38

Цитата:

Сообщение от Kolyaj
И что делает эта фнкция тогда
Ничего она не делает. Чтобы функция что-то делала, нужно ее вызвать, а тут она не вызывается

Ну хорошо тогда какой смысл от пррисваивания

Kolyaj 12.08.2009 18:45

Экономия символов.

zzz 12.08.2009 18:50

Цитата:

Сообщение от Kolyaj (Сообщение 26685)
Экономия символов.

А можно дать полный ответ? Каким образом она экономит символы и для чего это нужно?

Kolyaj 12.08.2009 18:56

zzz,
а вас учителя в школе не били (или бьют)?

Цитата:

Сообщение от zzz
Каким образом она экономит символы и для чего это нужно?

Тем, что вместо src.toString нужно набирать просто p.

zzz 12.08.2009 18:58

Блин так вы про это. Ну хорошо а какой смысл от использования toString

zzz 12.08.2009 20:22

Я имею ввиду если он не чего не возвращает зачем он нужен?

zzz 12.08.2009 21:00

Я сначла подумал что toString это свойство класса Animal
this.toString = function() {
        return name+" на расстоянии "+this.distance
    }

Но если названия toString заменить и там и там то не работает
Кажется я понял всё это дополнение для ИЕ как раз ради этого свойства ведь оно toString а его как раз в операторе цикла for...in...нету. Осталось только понять почему свойство называется именно toString ведь скобок нету значит и к строковому типу не приводит и заменить название нельзя тогда не работает...

zzz 12.08.2009 21:14

Цитата:

Сообщение от Kolyaj
а toString обычно функция.

Почему она называется именно так?

Kolyaj 12.08.2009 22:09

zzz,
извини, но я устал разгребать кашу в твоей голове :) Поспи, прочитай еще раз статьи на этом сайте, может поймешь.

Андрей Параничев 12.08.2009 22:13

var someObject = {
    "title" : "Я — объект",
    "toString" : function() {
        return "Но если меня хотят использовать, как строку, я буду ею!";
    }
}

alert(someObject.title); // Я — объект
alert(someObject); // Но если меня хотят использовать, как строку, я буду ею!

Riim 13.08.2009 04:22

Цитата:

Сообщение от zzz
Там по английски я не понимаю

http://yandex.ru/yandsearch?text=сократ+персональн й
http://www.translate.ru/text_Translation.aspx
http://translate.google.com/translate_t#

zzz 13.08.2009 07:16

То есть всё таки toString превращает в строку и выводит эту строку с помошью модального окна. Но зачем Андрей у вас как "Я объект" как "Но если меня..." вывелись одинаково хотя к строковому типу превели только вторую запись. Может чтобы использовать свойства и методы объекта String?(поправте если я не прав)

Андрей Параничев 13.08.2009 17:59

zzz,
toString() возвращает строковое представление объекта.
Она вызывается, например, когда вы пытаетесь использовать объект, как строку: вывести в модальном диалоге alert, или провести конкатенацию с другой строкой.

zzz 14.08.2009 10:29

Но можно выводить и не ввиде строки например "title" : "Я — объект",
и как уже сказали там не toString() а toString

x-yuri 14.08.2009 11:17

Цитата:

Сообщение от zzz
Но можно выводить и не ввиде строки например "title" : "Я — объект",

можно
alert('"title" : "'+someObject.title+'"');


Цитата:

Сообщение от zzz
и как уже сказали там не toString() а toString

можно считать, что alert(someObject); - то же самое что alert(someObject.toString());

zzz 14.08.2009 11:20

Дак почему метод тогда называется toString? Он превращает значение в строку или нет? Ответе наконец-то. Если превращает то почему скобок то нету. Если превращает то зачем чтобы использовать методы и свойства встроеного объекта String?

x-yuri 14.08.2009 11:39

Цитата:

Сообщение от zzz
Он превращает значение в строку или нет?

да
var a=1, b=2, c=true;
alert(a.toString == b.toString);
alert(a.toString == c.toString);
alert(typeof a);
alert(typeof a.toString());


Цитата:

Сообщение от zzz
Если превращает то зачем чтобы использовать методы и свойства встроеного объекта String?

если не надо, не используй
UPD: или ты думаешь, что в коде a.toString().replace('1', '2') ты не используешь методы объекта String?

zzz 14.08.2009 11:41

Я имею ввиду зачем превращать? Ведь и так работает. То есть если мы превратили то сможем использовать свойства и методы String?


Часовой пояс GMT +3, время: 03:13.