25
Javascript OOP Miao Siyu

Javascript OOP

Embed Size (px)

DESCRIPTION

Javascript OOP

Citation preview

Page 1: Javascript OOP

Javascript OOPMiao Siyu

Page 2: Javascript OOP

the question

Robot.instance.hello()

// Hi, I am Miao

Page 3: Javascript OOP

the question

Robot = {instance:{hello: function(){alert('Hi, I am Miao')}}}

Robot.instance.hello()

Page 4: Javascript OOP

the question

Robot : classRobot.instance: singleton of RobotRobot.instance.hello: class method

Page 5: Javascript OOP

1. class

function Robot(){}

Page 6: Javascript OOP

2. instance variable

function Robot(){    this.name = 'Miao';}

Page 7: Javascript OOP

what's this

function Robot(){    this.name = 'Miao';}

Robot() *

new Robot()

Page 8: Javascript OOP

what's this

var a = {name:'miao'}

var say = function(){alert(this.name)}

var name = 'miao2'

a.say = say

a.say() // miao

say() // miao2

setTimeout(a.say, 0) // miao2**

Page 9: Javascript OOP

3. method

function Robot(){    this.name = 'Miao';}

Robot.prototype.hello= function () {    alert('Hi, I am '+this.name)}

a = new Robot('miao')a.hello()

Page 10: Javascript OOP

3. method: why prototype

function Robot(){    this.name = 'Miao';}

Robot.prototype.hello= function () {    alert('Hi, I am '+this.name)}

a = new Robot('miao')a.hasOwnProperty('hello')a.hasOwnProperty('name')

1000 Robot, 1000 name, one hello function

Page 11: Javascript OOP

prototype & constructor

function Robot(){}

r = new Robot()

r.constructor.prototype

Robot.prototype.constructor

__proto__: non standard

Page 12: Javascript OOP

4. class function/ property

first-class function

function Robot(){    this.name = 'Miao';}

Robot.hello= function(){alert('Robot')}

Robot.size = {height:20, width:15}

Page 13: Javascript OOP

5. closure & self-executed function

var instance = new ( function Robot(name){   this.name =name;})('miao');

var instance = (function (name){   return {name: name};})('miao');

(function($){    ...})(jquery);

Page 14: Javascript OOP

5. closure & self-executed function

var nextId = (function(){    var id = 0;    return function(){        return id++    }})();

Page 15: Javascript OOP

5. closure & self-executed function

function Robot(){this.name = 'miao'}

Robot.getInstance= (function(){    var _instance;    return function(){        if(!_instance)_instance= new Robot();        return _instance;    }})();

r1 = Robot.getInstance()

r2 = Robot.getInstance()

r1 === r2

Page 16: Javascript OOP

6. getter & setter

function Robot(name){    this.name= name;}

Robot.prototype = {

    get name(){        console.log ('getter', this._name);        return this._name; },    set name(name){        console.log ('setter', this._name, name);        this._name  = name ; }} ;

Page 17: Javascript OOP

6. getter & setter

function Robot(name){    this.name= name;

    Object.defineProperty(this, 'type', {value: 'Robot',

        writable: false, enumerable: false,

        configurable: false});

    // get / set can be defined }

Page 18: Javascript OOP

6. getter & setterfunction Robot(name){    this.name= name;

}

Robot.prototype.hello = function(){alert('Hi, I am '+this.name)}

Robot.__defineGetter__('instance', (function(){

    var _instance;

    return function () {

        if (!_instance) _instance = new Robot('miao');

        return _instance;

    }

})());

Page 19: Javascript OOP

**: bind / call / apply

var a = {name:'miao'}

var say = function(){alert(this.name)}

var name = 'miao2'

setTimeout(a.say.bind(a), 0) // miao

function funca(a,b,c){alert(a+b+c)}funcb = funca.bind(null, 1)

Page 20: Javascript OOP

**: bind / call / apply

function b() {console.log(arguments);arguments.sort()}

b(2,1,3) // error

sort= Array.prototype.sort

function b() {console.log(arguments);console.log(sort.call(arguments))}

b(2,1,3) // 1,2,3

Page 21: Javascript OOP

*: force new

function Robot(name){if(!(this instanceof Robot)){return new Robot(name) }else{this.name= name;    }}

Robot('miao')new Robot('miao')

Page 22: Javascript OOP

array function

a = [1,3,2]

some: var flag = a.some(function(item,i){if(item>1){return true}});forEach: a.forEach(function(item,i){console.log(item)});reduce: a.reduce(function(item, sum, i){return item+sum;}, 0)sort: a.sort(function(itema,itemb){return itemb-itema})map: a.map(function(item,i){return item*item});filter: a.filter(function(item,i){return item>1})Splice:indexOf: Array.prototype.indexOf = function(){...}

Page 23: Javascript OOP

extend class

function A() {this.name='a'}function B(){this.type='b'} B.prototype.constructor= Ab = new B() // B {type: "b", name: "a"}

b instanceof Bb instanceof A

a = new A()B.prototype.fb = function(){alert('B.fb')}B.prototype.fa = function(){alert('B.fa')}A.prototype.fa = function(){alert('A.fa')}

// a: {name: "a", fa: function}// b: {type: "b", name: "a", fb: function, fa: function}

Page 24: Javascript OOP

clone object

function clone(obj) {

    if (null == obj || "object" != typeof obj) return obj;

    var copy = obj.constructor();

    for (var attr in obj) {

        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];

    }    return copy;

}

Page 25: Javascript OOP

clone object

if (!Object.create) {

    Object.create = function (o) {

        var F= function () { };

        F.prototype = o;

        return new F();

    } ;

}