面向对象编程
面向对象编程
Object - Oriented
OOP
以对象为面向的编程
请背诵:
Class 类
定义对象的特征。它是对象的属性和方法的模板定义.
Object 对象
类的一个实例。
Property 属性
对象的特征,比如颜色。
Method 方法
对象的能力,比如行走。
Constructor 构造函数
对象初始化的瞬间, 被调用的方法. 通常它的名字与包含它的类一致.
Inheritance 继承
一个类可以继承另一个类的特征。
Encapsulation 封装
一种把数据和相关的方法绑定在一起使用的方法.
Abstraction 抽象
结合复杂的继承,方法,属性的对象能够模拟现实的模型。
Polymorphism 多态
多意为‘许多’,态意为‘形态’。不同类可以定义相同的方法或属性。
命名空间:
var a = a || {};
对于
a || b
c && d
值基本不可能是true/fasle
&& 找第一个fasle值
例如
1 && 0 && 1
返回0
1 && 0 && console.log(2)
返回0,并且console.log不执行
|| 找第一个true值
例如
var a = b || {}
返回{}
类Class
造一个模板
View
封装view
window.View = function(selector){
    return document.querySelector(selector)
}
引用View
var view = View('#leaveMessages');
Model
封装Model
    window.Model = function(options){
        let resourceName = options.resourceName;
        return {
            init:function(){
                var APP_ID = '6lvWkua1rf93YuTrlvBN8GVR-gzGzoHsz';
                var APP_KEY = 'uPlBTdzbkh8JANXfgEN8j0Lv';
                AV.init({
                appId: APP_ID,
                appKey: APP_KEY})
            },
            fetch:function(){
                var query = new AV.Query(resourceName);
                return query.find();
            },
            save:function(username,content){
                var Messages = AV.Object.extend(resourceName);
                var messages = new Messages();
                return messages.save(object)
            }
        }
    }
调用Model
var model = Model({resourceName:'Messages'});
 model.init();
 model.fetch();
 model.save({'username': username,'content':content});
Controller
封装Controller
window.Controller = function(options){
    var init = options.init;
    let object = {
        view: null,
        model: null,
        init: function(view,model){
            this.view = view;
            this.model = model;
            this.model.init();
            init.call(this,view,model);
            options.bindEvents.call(this);
        },
    }
    for (let key in options){
        if(key !== 'init'){
            object[key] = options[key]
        }
    }
}
调用Controller
var controller = Controller({
        init: function(view,controller){
            this.messageList = view.querySelector('#messageList');
            this.form = view.querySelector('form');
            this.loadMessages();
        },
        loadMessages: function(){
            this.model.fetch().then(
                (messages) => {
                    let array = messages.map((item) => item.attributes);
                    array.forEach((item) => {
                        let li = document.createElement('li');
                        li.innerText = `${item.username} : ${item.content}`;
                        this.messageList.appendChild(li);
                    })
                }
            )
        },
        bindEvents: function(){
            this.form.addEventListener('submit',(e) => {
                e.preventDefault();
                this.saveMessage();
            })
        },
        saveMessage: function(){
            let myForm = this.form;
            let content = myForm.querySelector('input[name=content]').value;
            let username = myForm.querySelector('input[name=username]').value;
            if(content !== '' && username !== ''){
                this.model.save(username,content).then(function(object){
                    let li = document.createElement('li');
                    li.innerText = `${object.attributes.username} : ${object.attributes.content}`;
                    let messagesList = document.querySelector('#messageList');
                    messagesList.appendChild(li);
                    myForm.querySelector('input[name=content]').value = '';
                })
          }else  {
              alert('请输入用户名或者留言内容');
          }
        }
    }
);
如何寻找this?
controller === object
controller.init(view, model)
controller.init.call(controller, view, model)
那么 controller.init 里面的 this 当然 TM 是 controller
也就是这个1里面的object
controller.init 里面的 this 就是 object
object.init 里面的 this 就是 object
- initB.call(this)
initB 里面的 this === call 后面的this
call 后面 this === 第二条里的 this
第二条里面的 this === object
=> initB 里面的 this 就是 object 
复习this
function X(){
    return object = {
        name:'object',
        f1(x){
            x.f2();
        },
        f2(){
            console.log(this); //A
        }
    }
}
var options = {
    name:'options',
    f1(){},
    f2(){
        console.log(this); //B
    }
}
var x = X();
x.f1(options);
B options
why?
x=X(),那么X().f1(options)
X()return object,那么object.f1(options)
object里的f1那么就是f1(x){x.f2()}
x是options,那么就是f1(options){options.f2()};
f2是console.log(this),this是options,打印options
function X(){
    return object = {
        name:'object',
        f1(x){
            x.f2.call(this);
        },
        f2(){
            console.log(this); //C 
        }
    }
}
var options = {
    name:'options',
    f1(){},
    f2(){
        console.log(this);  //D
    }
}
var x = X();
x.f1(options);
D object
why?
x.f2.call(this) this === object
x.f2 === options.console.log(this)
this === object
function X(){
    return object = {
        name:'object',
        options:null,
        f1(x){
            this.options = x;
            this.f2();
        },
        f2(){
            this.options.f2.call(this);
        }
    }
}
var options = {
    name:'options',
    f1(){},
    f2(){
        console.log(this);  //this === ?
    }
}
var x = X();
x.f1(options);
this === object;
why?
this = object;
object.options = x;//object.options = options;
this.f2() === object.f2() === object.options.f2.call(this);
new
var object = new Object();
自有属性 空
oject.proto === Object.prototype;
var array = new Array(‘a’,’b’,’c’);
自有属性 0:’a’,1:’b’,2:’c’,length:3
array.proto === Array.prototype;
Array.prototype.proto === Object.prototype;
Array is a function!
Array.proto === function.prototype;
构造一个new
function Human(options){
   this.name = options.name;
   this.city = options.city;
}
Human.prototype.species = 'Human';
Human.prototype.walk = function(){};
Human.prototype.useTools = function(){};
调用
var human = new Human({name:'Frank', city: 'Hangzhou'})
var human2 = new Human({name:'Jack', city: 'Hangzhou'})
其中
human.__proto__.constructor === Human //true
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!