문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
javascript:objectoriented [2011/12/02 21:23] kwon37xi [setInterval] |
javascript:objectoriented [2012/03/16 15:38] (현재) kwon37xi |
||
|---|---|---|---|
| 줄 139: | 줄 139: | ||
| </ | </ | ||
| 위에서 '' | 위에서 '' | ||
| + | |||
| + | ===== John Resig Class.extend ===== | ||
| + | * [[http:// | ||
| + | <code javascript> | ||
| + | // "use strict" | ||
| + | /* | ||
| + | * Simple JavaScript Inheritance By John Resig http:// | ||
| + | * http:// | ||
| + | */ | ||
| + | // Inspired by base2 and Prototype | ||
| + | (function () { | ||
| + | "use strict"; | ||
| + | |||
| + | var initializing = false, fnTest = / | ||
| + | xyz; | ||
| + | }) ? / | ||
| + | |||
| + | // The base Class implementation (does nothing) | ||
| + | window.Class = function () { // edited for use strict | ||
| + | }; | ||
| + | |||
| + | // Create a new Class that inherits from this class | ||
| + | Class.extend = function (prop) { | ||
| + | var _super = this.prototype; | ||
| + | // Instantiate a base class (but only create the instance, | ||
| + | // don't run the init constructor) | ||
| + | initializing = true; | ||
| + | var prototype = new this(); | ||
| + | initializing = false; | ||
| + | |||
| + | var name; | ||
| + | |||
| + | // Copy the properties over onto the new prototype | ||
| + | for (name in prop) { | ||
| + | // Check if we're overwriting an existing function | ||
| + | prototype[name] = typeof prop[name] === " | ||
| + | && fnTest.test(prop[name]) ? (function (name, fn) { | ||
| + | return function () { | ||
| + | var tmp = this._super; | ||
| + | |||
| + | // Add a new ._super() method that is the same method | ||
| + | // but on the super-class | ||
| + | this._super = _super[name]; | ||
| + | |||
| + | // The method only need to be bound temporarily, | ||
| + | // remove it when we're done executing | ||
| + | var ret = fn.apply(this, | ||
| + | this._super = tmp; | ||
| + | |||
| + | return ret; | ||
| + | }; | ||
| + | }(name, prop[name])) : prop[name]; | ||
| + | } | ||
| + | |||
| + | // The dummy class constructor | ||
| + | function Class() { | ||
| + | // All construction is actually done in the init method | ||
| + | if (!initializing && this.init) | ||
| + | this.init.apply(this, | ||
| + | } | ||
| + | |||
| + | // Populate our constructed prototype object | ||
| + | Class.prototype = prototype; | ||
| + | |||
| + | // Enforce the constructor to be what we expect | ||
| + | Class.prototype.constructor = Class; | ||
| + | |||
| + | // And make this class extendable | ||
| + | Class.extend = window.Class.extend; | ||
| + | |||
| + | return Class; | ||
| + | }; | ||
| + | }()); | ||
| + | </ | ||
| + | |||
| + | <code javascript> | ||
| + | // 용례 | ||
| + | |||
| + | var Person = Class.extend({ | ||
| + | init: function(isDancing){ | ||
| + | this.dancing = isDancing; | ||
| + | }, | ||
| + | dance: function(){ | ||
| + | return this.dancing; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | var Ninja = Person.extend({ | ||
| + | init: function(){ | ||
| + | this._super( false ); | ||
| + | }, | ||
| + | dance: function(){ | ||
| + | // Call the inherited version of dance() | ||
| + | return this._super(); | ||
| + | }, | ||
| + | swingSword: function(){ | ||
| + | return true; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | var p = new Person(true); | ||
| + | p.dance(); // => true | ||
| + | |||
| + | var n = new Ninja(); | ||
| + | n.dance(); // => false | ||
| + | n.swingSword(); | ||
| + | |||
| + | // Should all be true | ||
| + | p instanceof Person && p instanceof Class && | ||
| + | n instanceof Ninja && n instanceof Person && n instanceof Class | ||
| + | |||
| + | </ | ||
| + | |||