Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var popup= function () { this.initialize.apply(this, arguments); };
popup.prototype = {
initialize: function (h) { /** вызывается при инициализации**/ } ,
show: function (text) { ... } ,
close: function () { ... }
}
}var p=new popup({caption:'Alert'}); //вызывается инициализация класса в которую передаем параметры
p.show('Hello');
p.close();var Class = function (Parent, proto) {
if (proto == null) {
proto = Parent;
Parent = null;
}
var Constructor = function () {
this.initialize.call( this, arguments );
};
F.prototype = Parent.prototype
Constructor.prototype = new F();
Constructor.prototype.constructor = Child;
Constructor.parent = Parent;
};
var Foo = Class({
initialize: function () {
// constructing here
},
fooMethod: function () {
// fooMethod here
}
});
var Bar = Class(Foo, {
initialize: function () {
Bar.parent.initialize.apply( this, arguments );
// construction here
},
barMethod: function () {
var f = this.fooMethod();
// barMethod here
}
});
И чем меньше кода — тем читабильнее и легче воспринимается. И с классами та же история. Много лишнего кода, исключительно для сахара. Чем не устраивает прототипное наследование? Абсолютно все те же возможности.
F.prototype = Parent.prototype
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.parent = Parent;
Child.prototype = new Parent();
Меня одного коробят подобные фразы? Интерпретатор начнет ругаться при первой же попытке вызвать метод прототипа.
А что случится если скобки забыть? Тоже ведь ошибки не будет. Почему тут не предусмотрена защита?
var $ = function (selector, context) {
if (! (this instanceof $)) {
return new $(selector, context);
}
this.find( selector, context );
};
$.fn = $.prototype = {
// prototype here
};
var $divs = $('div');
// эквивалентно:
var $divs = new $('div');
$.prototype.initvar dom = function (sel, context) {
if (! (this instanceof dom)) {
return new dom(sel, context);
}
// initialize
}
new dom('tag.class'), но ради упрощения api я добавил возможность не писать «new»: dom('tag.class'). С таким же успехом я мог вынести содержимое dom в какую-то функцию-конструктор, но зачем? ;)var myFunc = function()
{
//используем this
}
myFunc = new myFunc();
var myFunc = new function()
{
//используем this
}
В строгом режиме стандарта ECMAScript 5 this в этом случае не будет указывать на глобальный объект. Посмотрим, как можно избежать этой ошибки, если ECMAScript 5 недоступен.
(function () {
var test = function () {
console.log(this);
};
test(); // window
test.call(null); // window
})();
(function () {
'use strict';
var test = function () {
console.log(this);
};
test(); // window
test.call(null); // null <=========
})();
this is evaluated within strict mode code, then the this value is not coerced to an object. A this value of null or undefined is not converted to the global object and primitive values are not converted to wrapper objects. The this value passed via a function call (including calls made using Function.prototype.apply and Function.prototype.call) do not coerce the passed this value to an object.this в строгом режиме не приводится к объекту. Если this имеет значение null или undefined, this не будет приведено к глобальному объекту. Если значение this базового типа, оно не будет преобразовано в соответствующий объект. Значение this, переданное через вызов функции (в том числе, вызовы через Function.prototype.apply и Function.prototype.call), не будет преобразовано в объект.» В стандарте нет ограничений по способу вызова.undefined, вызов через Function.prototype.call — null. Я опирался на стандарт, но любой стандарт разбивается о практику :(
Создание объектов в Javascript