LINUX.ORG.RU

[js] Что делать, чтобы не было путаницы с this в роли контекста и в роли создаваемого объекта?

 


0

2

А то получается, что в некоторых методах нужно, чтобы this указывало на объект, а оно указывает на всякий мусор.

★★★★★

Последнее исправление: sphericalhorse (всего исправлений: 1)
Ответ на: комментарий от sphericalhorse

s/дочернем класе/дочернем конструкторе/

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Блин, у меня просто 500 строк кода и я уже не всё помню.

Подождите несколько минут. Сейчас рожу.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от Deleted
[ivan@arch tmp]$ cat this.js 
function a() {
	this.head = {}
	var opt = function () {
		console.log(this === global) // true
		console.log(this.head.ass) // cannot read prop...
	}
	this.show = function () {
		opt()
	}
}

function b() {
  this.head.ass = 'not head'
}
b.prototype = new a()

obj = new b()
obj.show()



[ivan@arch tmp]$ cat self.js 
function __spFormMethods() {
	var self = this
	self.formAttrs // <form> tag attrbutes
	self.form = {} // Result

	self.addInput = function () {
		var field = document.createElement('input') 

		self.form.appendChild(field)// Object #<Object> has no method 'appendChild'
	}
}

function spForm() {
	var self = this
	self.form = document.createElement('form')
}
spForm.prototype = new __spFormMethods()


var test = new spForm()
test.addInput()

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

Хотя в варианте с self получается, что метод из родительского класса не имеет доступа к свойствам дочернего.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

Оно? Если я правильно понимаю, что ты хочешь. Терпеть не могу прототипы, так что могу и наврать :}

function __spFormMethods() {
	this.self = this;
	//self.formAttrs // <form> tag attrbutes
	self.form = {}; // Result

	self.addInput = function () {
		var field = document.createElement('input');
		self.form.appendChild(field); // Object #<Object> has no method 'appendChild'
	}
	return self
}

function spForm() {
	self.form = document.createElement('form');
}

spForm.prototype = new __spFormMethods();
var test = new spForm();
test.addInput();
Deleted
()
Ответ на: комментарий от xpahos

Мои знания скудны, но мне кажется, что это конструктор.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Ещё один завтык с моей стороны. В браузере self - глобальная переменная. Меняем self на that и код не работает.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Что тогда делать? Нужна куча объектов, в которых методы и некоторые свойства совпадают. Раньше всё работало впихивая все методы в каждый объект, но это было до того, как всё в гитхаб попало.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

Я так понимаю, переходить на процедурный стиль уже поздно? Забить и пользоваться this :}

Ну, может завтра ещё JFreeM напишет что.

Deleted
()
Ответ на: комментарий от Deleted

Я так понимаю, переходить на процедурный стиль уже поздно?

Я матана не знаю. Пример этого вашего процедурного стиля можно?

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

tl;dr Процедурный — функциями, без объектов.

Deleted
()
Ответ на: комментарий от sphericalhorse
function a() {
	this.head = {};
}
a.prototype.show = function() {
   print(this.head.ass);
};
b.prototype = new a();
function b() {
  this.head.ass = 'not head'; 
}
obj = new b()
obj.show();

d8> load(«this.js»)
not head

Как-то так

d0cent
()
Ответ на: комментарий от sphericalhorse

натупил. ты просто запутался уже совсем, короче суть такова (псевдокод)

var __spFormMethods = function () {

}

__spFormMethods.prototype = new Object()

__spFormMethods.prototype.addInput = function () {
  var field = document.createElement("input")
  this.form.appendChild(field)
}

var spForm = function () {
  __spFormMethods.apply(this, [])
  this.form = document.createElement("form")
}

spForm.prototype = new __spFormMethods()
trashymichael ★★★
()
Ответ на: комментарий от sphericalhorse

То, что ты пытался сделать:

function Base() {
 this.head = {};
 var self = this;
 var bar = function () {
  console.log(self); 
  console.log(self.head.ass);
 }
 this.foo = function () { bar(); }
}

function Derived() {
  this.head.ass = 'not head';
}
Derived.prototype = new Base;

var obj = new Derived;
obj.foo();

Проблема твоего кода в том, что ты внутри функции opt обращаешься к this... который указывает на глобальный объект, а не на то что тебе нужно, т.е. на b.prototype:

function a() {
	this.head = {}
	var opt = function () {
		console.log(this === global) // true
		console.log(this.head.ass) // cannot read prop...
	}
	this.show = function () {
		opt()
	}
}

function b() {
  this.head.ass = 'not head'
}
b.prototype = new a()

obj = new b()
obj.show()

Т.е. внутри ф-ии a() this указывает туда, куда ты предполагаешь, но внутри a.opt() уже в другое место.

Reaper ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.