createjs的get和set以及简单的封装
get,set在java,as3等语言中用的非常普遍,那在js中怎么实现?createjs实现起来有什么不同?为什么要用get,set?鄙人今天就给大家讲解一下。
首先我先发一个网上别人写的get,set。
var age = 18; var test = { get age (){ return age; }, set age (value){ if(value > 100) age= new Date().getFullYear() - value; else age = value; } };
或者这样
function Person() { var age = new Date().getFullYear() - 18; Object.defineProperty(this, "age", { get: function () { alert("内部存储数据为:" + age); return new Date().getFullYear() - age; }, set: function (value) { age = value; } }); }
那用createjs实现会有什么不同呢,其实差不多,但是要结合createjs的OOP,下面我写一个。
//BaseShape (function() { function BaseShape(wid,hei){ this.Shape_constructor(); this._width = wid; this._height = hei; } var p = createjs.extend(BaseShape,createjs.Shape); p._getWidth = function () { return this._width*this.scaleX; } p._setWidth = function (value) { this.scaleX = value/this._width; } p._getHeight = function () { return this._height*this.scaleY; } p._setHeight = function (value) { this.scaleY = value/this._height; } Object.defineProperties(p, { width: { get: p._getWidth, set: p._setWidth }, height: { get: p._getHeight, set: p._setHeight } }); cls.BaseShape = createjs.promote(BaseShape, "Shape"); }());
大家可以看到我封装了createjs的Shape类,与之前的不同之处是把p也就是类的原型链传进去了,并添加了width和height的存取器,优点显而易见的,之前createjs不能使用width和height,这样子就可以使用了。
var shape = new cls.BaseShape(400,200); shape.graphics.beginFill("#ff0000"); shape.graphics.drawRect(0,0,400,200);//必须和构造函数上初始化的大小统一 shape.graphics.endFill(); stage.addChild(shape); shape.width = 600; shape.height = 300;
但是由于api无法获得实际大小,所以创建类的时候需要赋值一个原始大小。
有些童鞋也许会说,用function实现也一样不需要用get,set这种存取器。其实实际上,很多场景必须要用存取器,比如下面:
http://www.ajexoop.com/demo/getsettest/index.html
源代码:
//main.js var canvas,stage function init() { canvas = document.getElementById("mainView"); stage = new createjs.Stage(canvas); stageBreakHandler(); var shape = new cls.BaseShape(400,200); shape.graphics.beginFill("#ff0000"); shape.graphics.drawRect(0,0,400,200);//必须和构造函数上初始化的大小统一 shape.graphics.endFill(); stage.addChild(shape); // shape.width = 600; // shape.height = 300; createjs.Tween.get(shape).to({width:1200,height:600}, 2000).call(function (){console.log(shape.width,shape.height)}) createjs.Ticker.timingMode = createjs.Ticker.RAF_SYNCHED; createjs.Ticker.setFPS(30); createjs.Ticker.addEventListener("tick", stageBreakHandler); } function stageBreakHandler(event) { stage.update(); } var cls = {}; //BaseShape (function() { function BaseShape(wid,hei){ this.Shape_constructor(); this._width = wid; this._height = hei; } var p = createjs.extend(BaseShape,createjs.Shape); p._getWidth = function () { return this._width*this.scaleX; } p._setWidth = function (value) { this.scaleX = value/this._width; } p._getHeight = function () { return this._height*this.scaleY; } p._setHeight = function (value) { this.scaleY = value/this._height; } Object.defineProperties(p, { width: { get: p._getWidth, set: p._setWidth }, height: { get: p._getHeight, set: p._setHeight } }); cls.BaseShape = createjs.promote(BaseShape, "Shape"); }());
这个demo是用tween做的,而tween的参数只能传属性,不能传方法,那get,set的优势就出来了,可以靠存取器封装。很多类实际上也应该用一个属性就可以改变其效果,这样更加的OOP,也更加的方便。
匿名
666