Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, 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);
}
};
}
Самовызывающийся конструктор Джона Резига и размышление о том, почему это решение не прижилось