Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает код? Вопрос о this.constructor. (https://javascript.ru/forum/misc/31272-pochemu-ne-rabotaet-kod-vopros-o-constructor.html)

FINoM 01.09.2012 16:04

nerv_, а где список всех задач посмотреть?

nerv_ 01.09.2012 18:36

FINoM, я знаю только этот способ - здесь нажать показать/спрятать задачи.

FINoM 01.09.2012 23:59

Собсно, вопрос, исходя из темы: какими способами можно модифицировать прототип свойствами другого объекта (или его прототипа) во время или после инициализации экземпляра конструктора?

В разделе "ваши сайты и скрипты" я предложил два метода: использовать __proto__ и тупо соединить старый прототип с новым объектом, просто копируя новые свойства.

FINoM 02.09.2012 03:49

После долгого и нудного гугления, определил, что никак. Когда-нибудь в браузерах появится Object.setProrotypeOf, но сейчас этот метод только обсуждается.

devote 02.09.2012 04:16

вот нашел у себя в хламе давно как то экспериментировал:
function setProto( object, proto ) {

	if ( "__proto__" in Object.prototype ) {
		return object.__proto__ = proto, object;
	}

	var protoFn = function() {},
		hasDefine = false;

	try {
		Object.defineProperty({}, 'test', {value:null});
		hasDefine = true;
	} catch( _e_ ) {}

	protoFn.prototype = proto;
	proto = new protoFn();

	for( var key in object ) {
		if ( object.hasOwnProperty( key ) ) {
			if ( hasDefine ) {
				Object.defineProperty( proto, key, Object.getOwnPropertyDescriptor( object, key ) );
			} else {
				proto[ key ] = object[ key ];
			}
		}
	}

	return proto;
}


var a = {
	get name() {
		return "Hello";
	},
	testA: function() {}
}

var b = {
	get name() {
		return Object.getPrototypeOf( this ).name + " world";
	},
	testB: "str",
	he: undefined
}

var c = {
	name: function() {
		return Object.getPrototypeOf( this ).name + " world test";
	}
}

b = setProto( b, a )
c = setProto( c, b );

alert( c.name() );

FINoM 02.09.2012 04:19

devote, да, я тоже такое решение нашел. Но нужно не вернуть объект с новым прототипом, а привязать к уже готовому.

FINoM 02.09.2012 04:23

А вот зачем мне это: http://javascript.ru/forum/project/3...edovaniya.html (если ты тему раньше не заметил).

devote 02.09.2012 04:34

Цитата:

Сообщение от FINoM
а привязать к уже готовому.

ну это вряд ли сделаешь, а тупое копирование приведет к разрушению наследования.. То есть instanceof перестанет работать как надо.

devote 02.09.2012 04:35

Цитата:

Сообщение от FINoM
(если ты тему раньше не заметил).

я видел эту тему

nerv_ 02.09.2012 11:59

Цитата:

Сообщение от FINoM
Собсно, вопрос, исходя из темы: какими способами можно модифицировать прототип свойствами другого объекта (или его прототипа) во время или после инициализации экземпляра конструктора?

модифицировать можно. Вопрос в том, требуется ли, чтобы ранее созданные объекты имели доступ к новым методам и свойствам. Привязка новых свойств к прототипу после создания объекта не "совсем правильно".


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