Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
определяемый этой библиотекою конструктор называется (очевидно, для краткости) просто «L» — а не «Leaflet», например. Шесть букв экономятся. Но ведь можно, можно было бы сэкономить ещё четыре символа
var instance = new Constructor;
Consctructor.call(instance);
(function () { var L = Leaflet; ... }());
в каждом месте, где используется библиотека, я решил сделать наоборот — создавать переменную L безопасно, сохраняя старое значение (если есть), и дать возможность восстановить его, объявив для Leaflet любой другой неймспейс:var Leaflet = L.noConflict(); // после этого L указывает на старое значение
(function (L) {
...
}(L.noConflict()));
var MyClass = atom.Class({
Static: function () {
invoke: function () {
// source here
}
}
});
var number = Number(arg);
var number = new Number(arg);
var string = String(arg);
var string = new String(arg);
var source = new Point(3, 4);
var clone = new Point(source);
var same = Point(source);
console.log(
clone == source, // false
same == source // true
);
приводить собственные типы отдельными функциями, названными через lower-case (point(...) или toPoint, неважно)
[ [1,1], [2,2], [3,3] ].map( Point.from );
[ [1,1], [2,2], [3,3] ].map( Point.from.bind(Point) );
[ [1,1], [2,2], [3,3] ].map( Point );
LibCanvas.Geometry = atom.Class({
Static: {
from : function (obj) {
return obj instanceof this ? obj : new this(obj);
}
}
});
LibCanvas.Point = atom.Class({
Extends: LibCanvas.Geometry,
});
[ [0,1], [1,0], [1,1] ].map( LibCanvas.Point.from ); // fail
LibCanvas.Geometry = atom.Class({
Static: {
invoke : function (obj) {
return obj instanceof this ? obj : new this(obj);
}
}
});
LibCanvas.Point = atom.Class({
Extends: LibCanvas.Geometry,
});
[ [0,1], [1,0], [1,1] ].map( LibCanvas.Point ); // success
var Parent = function() {};
Parent.method = function () {
// this is link to Parent
};
var Child = function() {};
Child.method = Parent.method;
function toPoint(obj) {
return obj instanceof Point ? obj : new Point(obj);
}
function toRectangle(obj) {
return obj instanceof Rectangle ? obj : new Rectangle(obj);
}
function toCircle(obj) {
return obj instanceof Circle ? obj : new Circle(obj);
}
function factory (Class) {
return function (obj) {
return obj instanceof Class ? obj : new Class(obj);
}
};
var toRectangle = factory(Rectangle);
var toCircle = factory(Circle);
пользователь не дурак, он вряд ли будет приводить уже обозначенный тип к самому себе или сам проверит instanceof
var rect = new Rectangle(0,5,10,15);
var rect = new Rectangle({ from:[0,5], to:[10,15] });
var rect = new Rectangle({ from:{x:0,y:5}, to:{x:10,y:15} });
var rect = new Rectangle({ from:new Point(0, 5), to:new Point(10, 15) });
function makeClass(){
return function Constructor(args){
if ( this instanceof Constructor ) {
if ( typeof this.init == "function" )
this.init.apply( this, arguments );
} else
return new Constructor( arguments );
};
}
$(this) !== $(this);
'use strict'; function makeClass() { var newClass; var factoryIndicator = {}; return newClass = function(isFactory, args) { if (this instanceof newClass) { if (typeof this.init == 'function') { this.init.apply( this, (isFactory == factoryIndicator) ? args : arguments); } } else { return new newClass(factoryIndicator, arguments); } }; }
Самовызывающийся конструктор Джона Резига и размышление о том, почему это решение не прижилось