Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция extend (https://javascript.ru/forum/misc/30544-funkciya-extend.html)

Антон Крамолов 07.08.2012 23:54

Функция extend
 
function extend() {
    var target = arguments[0];
    alert(arguments.length);
    
    for (var i = 1; i < arguments.length; ++i) {
        var options = arguments[i];
        
        for (var prop in options) {
            alert(prop + ' ' + options[prop]);
            
            if (typeof arguments[i] == 'object') {
               target[prop] = extend({}, options[prop]);
            }
            else {
                target[prop] = options[prop];
            }
        }
    }
    
    return target;
}

var defaults = {width: 'auto', height: 'auto'};
var options = {width: '1000px'};
var c = extend({}, defaults, options);
alert(c.height);


Не пойму в чем ошибка

Антон Крамолов 08.08.2012 00:00

function extend() {
    var target = arguments[0];
    
    for (var i = 1; i < arguments.length; ++i) {
        var options = arguments[i];
        
        for (var prop in options) {          
            if (typeof options[prop] == 'object') {
               target[prop] = extend({}, options[prop]);
            }
            else {
                target[prop] = options[prop];
            }
        }
    }
    
    return target;
}


Спать хочу туплю

Антон Крамолов 08.08.2012 00:04

Вопрос как в js вызвать саму функцию не обращаяесь к ней по имени в php есть __FUNCTION__, а здесь как? По идеи this({}, options[prop])?

Антон Крамолов 08.08.2012 00:09

function extend() {
    var target = arguments[0];
    
    for (var i = 1; i < arguments.length; ++i) {
        var options = arguments[i];
        
        for (var prop in options) {          
            if (typeof options[prop] == 'object') {
               target[prop] = extend({}, options[prop]);
            }
            else {
                target[prop] = options[prop];
            }
        }
    }
    
    return target;
}

var a = {x: 'X', y: {yx: 'XX', yy: 'YY'}};
var b = {z: 'Z'};
var c = extend({}, a, b);
a.y.yx = 'TEST';
alert(c.y.yx);

Dim@ 08.08.2012 09:13

Антон Крамолов,
ээ, в чем вопрос? хм, extend - это функция наследования, а это что?

Aetae 08.08.2012 11:02

Цитата:

Сообщение от Антон Крамолов (Сообщение 195524)
Вопрос как в js вызвать саму функцию не обращаяесь к ней по имени в php есть __FUNCTION__, а здесь как? По идеи this({}, options[prop])?

arguments.callee
Но оно depricated, правильно именно по имени.

Dmitriyff 08.08.2012 11:24

function extend() {
    var options, name,
    	target = arguments[0] || {},
    	i = 1
    	length = arguments.length;

    for ( ; i < length; i++) {
    	if ( (options = arguments[i]) != null) {
    		for (var name in options) {
    			target[name] = options[name]
    		}
    	}
    }

    return target;
}

var defaults = {width: 'auto', height: 'auto'};
var options = {width: '1000px'};
var c = extend({}, defaults, options);
console.log(c); // {width: '1000px', 'height': 'auto'}

самый простой вариант
посмотрите реализацию у jQuery

Антон Крамолов 08.08.2012 11:28

extend пер-ся как расширить к наследованию имеет опосредованное отношение

Антон Крамолов 08.08.2012 11:32

Цитата:

Сообщение от Dmitriyff (Сообщение 195575)
function extend() {
    var options, name,
    	target = arguments[0] || {},
    	i = 1
    	length = arguments.length;

    for ( ; i < length; i++) {
    	if ( (options = arguments[i]) != null) {
    		for (var name in options) {
    			target[name] = options[name]
    		}
    	}
    }

    return target;
}

var defaults = {width: 'auto', height: 'auto'};
var options = {width: '1000px'};
var c = extend({}, defaults, options);
console.log(c); // {width: '1000px', 'height': 'auto'}

самый простой вариант
посмотрите реализацию у jQuery

Это плохой пример, если массив, содержит вложенные массивы то при модификации исходного массива будет модифицирована и копия

function extend() {
    var target = arguments[0];
    
    for (var i = 1; i < arguments.length; ++i) {
        var options = arguments[i];
        
        for (var prop in options) {          
            target[prop] = (typeof options[prop] == 'object') ? extend({}, options[prop]) : options[prop];
        }
    }
    
    return target;
}

Dmitriyff 08.08.2012 11:39

вы привели пример, я привел решение для него, то что там будут вложенный объекты вы не писали, мысли читать не умею =-((


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