bind гуглить, или это фича из coffee? А так, несмотря на ярую любовью к jade и stylus, я против этого вашего coffee — слишком уж высокоуровнев сабж, хотя идея хороша, от скобок бы отказался.
var i = new (function(){
this.publicVaribale = 0;
var privateVaribale = 1;
globalVaribale = 2; // suprise? hahaha!
})();
Учтите еще необходимость всегда обращаться к переменным-членам объекта через this - это те самые вкусные иголочки сего кактуса которые протыкают сейчас вам небо и заставили создать сию тему.
[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()
Оно? Если я правильно понимаю, что ты хочешь. Терпеть не могу прототипы, так что могу и наврать :}
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();
Что тогда делать? Нужна куча объектов, в которых методы и некоторые свойства совпадают. Раньше всё работало впихивая все методы в каждый объект, но это было до того, как всё в гитхаб попало.
используйте coffee-script
на мой взгляд вторая из двух главных его фич (первая это невозможность засорить глобальный скоп).
http://coffeescript.org/#fat_arrow
натупил. ты просто запутался уже совсем, короче суть такова (псевдокод)
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()
Не, я JS использую лишь на уровне «постольку поскольку». А this пользуюсь крайне редко (использую лишь как «быструю» ссылку на объект псевдокласса в «конструкторе»).
1) Если функция вызывается через new как конструктор объекта, this указывает на создаваемый объект.
2) Если функция запущена как метод объекта, this будет ссылкой на этот объект.
3) Если функция вызывается через call или apply, this указывает на объект переданный в call / apply.
4) В просто вызове функции, this становится равным глобальному объекту.
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() уже в другое место.
1) кофе можно на клиенте обрабатывать, насколько я помню
2) я предпочитаю компилировать, сразу ошибки всплывают, например, кроме того часто много чего компилировать надо внагрузку, меня не напрягает, да и ватчей можно навешать если надо
короче бесплатный хинт: всегда объявляй функции через var bla = function а не как ты делашь (не спрашивай зачем — гугли)
далее, методы надо объявлять впрототипе, как я выше писал, в конструкторе надо только их вызывать и устанавливать данные, например. иначе методы будут объявляться каждый раз при new, это же очевидно. конструктор это просто функция конструктор а не декларация класса
короче
var p = function () { }
p.prototype = new Object()
p.prototype.show = function () { console.log(this.e) }
var c = function () {
p.apply(this, [])
this.e = "asd"
}
c.prototype = new p()
k = new c() k.show()