JavaScript 【面向对象编程】

232 阅读5分钟

1. 面向对象Object-Oriented(O O) ——

在编程里面所谓面向是指以什么什么为主的,而不是字面意思,那么面向对象就是以对象为主要应用体的意思。

所谓面向对象它不是一个概念,全世界有多少个程序员,就可以给出多少个概念,面向对象其实是一个经验总结的编程模式。

1. JavaScript面向对象编程术语:

(1) 命名空间Namespace: JS 中命名空间只是另一个包含方法,属性,对象的对象.
     1.  全局命名空间: 一个全局对象被创建,所有的变量,方法和功能成为该对象的属性。使用命名空间也最大程度地减少应用程序的名称冲突的可能性。
     
         var MYAPP = MTAPP || {} //如果全局对象MTYAPP是真值,则返回这个值,否则新建一个空对象,这是兜底写法
     
     2.  子命名空间:MYAPP.event = {}
(2) 类Class: 定义对象的特征。它是对象的属性和方法的 模板.
(3) 对象Object: 类的一个实例.
(4) 属性Property: 对象的特征,比如颜色.
(5) 方法Method: 对象的能力,比如行走.
(6) 构造函数Constructor: 对象初始化的瞬间, 被调用的方法. 通常它的名字与包含它的类一致.
(7) 继承 Inheritance: 一个类可以继承另一个类的特征
(7) 封装Encapsulation: 一种把数据和相关的方法绑定在一起使用的方法.
(8) 抽象Abstract: 结合复杂的继承,方法,属性的对象能够模拟现实的模型.
(9) 多态Polymorphism: 多意为‘许多’,态意为‘形态’。不同类可以定义相同的方法或属性.

2. JavaScript面向对象实例:这是站在跨文件的角度总结的代码优化方式

   ! function () {

        var view = View('section.message') 

        var model = Model({
            resourceName: 'leaveMessage'
        })

        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.name} : ${item.content}`
                            this.messageList.appendChild(li)
                        })
                    })
            },
            bindEvents: function () {
                //把留言功能存到leanCloud数据库

                this.form.addEventListener('submit', (e) => { //监听form表单的submit事件
                    e.preventDefault() //防止form表单自动刷新页面
                    this.saveMessage()
                })
            },
            saveMessage: function () {
                let myForm = this.form
                let content = myForm.querySelector('input[name=content]').value //拿到用户输入的内容
                let name = myForm.querySelector('input[name=name]').value //拿到用户的名字
                this.model.save({
                        'name': name,
                        'content': content
                    })
                    .then(function (object) {
                        let li = document.createElement('li')
                        li.innerText = `${object.attributes.name} : ${object.attributes.content}`
                        let messageList = document.querySelector('#messageList')
                        messageList.appendChild(li)
                        myForm.querySelector('input[name=content]').value = ''
                        myForm.querySelector('input[name=name]').value = ''
                        console.log(object)
                    })
            }
        })
        controller.init(view, model)
    }.call()

—————————————————————————————————————————————————————————

2. new的语法:

1. 面向对象里面new关键字有两个作用:

  1. 在函数里面创建私有属性
  2. 在函数外面创建原型(prototype共有属性),并在函数里面指向这个原型(this. __ proto__ = 函数.prototype)。

2. 面向对象举例:

(1)、不用new关键字

  1. 一个js文件里写一下代码:
    //游戏里面创建100个常规士兵
    //每一个士兵私有属性:id不同、生命值不同
    //每一个士兵共有属性:都会行走、奔跑、死亡、攻击、防御、攻击力一样、都是美国步兵
    
    function create士兵(id){
        var temp = {}
        temp.__proto__ = 士兵原型
        this. __proto__ = create士兵.rototype
        this.ID = id,
        this.生命值 = 42
        return temp
    }
     
    create士兵.原型 = {
    
         constructor:士兵
        
        行走:function(){/*走两步的代码*/},
        奔跑:function(){/*狂奔的代码*/},
        死亡:function(){/*GO DIE*/},
        防御:function(){/*护脸*/},
        攻击:function(){/*attack*/}
        国家:function(){/*美国*/}
    }
    
  1. 在另一个文件里写调用上面代码的函数:
var 士兵们 = []
for(i=0;i<100;i++){
    士兵们.push(create士兵们(i))
}

(2)、使用new关键字

  1. 一个js文件里写一下代码:
    //游戏里面创建100个常规士兵
    //每一个士兵私有属性:id不同、生命值不同
    //每一个士兵共有属性:都会行走、奔跑、死亡、攻击、防御、攻击力一样、都是美国步兵
    
    function create士兵(id){
        ( create士兵.prototye = {constructor:士兵}  //不能这样写,会被下面的prototype覆盖掉)
        this.ID = id,
        this.生命值 = 42
    }
     
    create士兵.prototye = {
    
        //避免引用的prototype覆盖默认prototype里的constructor属性的第一种方法:
        constructor:士兵
        //避免引用的prototype覆盖默认prototype里的constructor属性的第二种方法:
       create士兵.prototype.国家 = '美国'
       create士兵.prototype.攻击 = '打他'
    
         constructor:士兵
        行走:function(){/*走两步的代码*/},
        奔跑:function(){/*狂奔的代码*/},
        死亡:function(){/*GO DIE*/},
        防御:function(){/*护脸*/},
        攻击:function(){/*attack*/}
        国家:function(){/*美国*/}
    }
    
  1. 在另一个文件里写调用上面代码的函数:
var 士兵们 = []
for(i=0;i<100;i++){
    士兵们.push(new create士兵(i))
}

(3)new关键字总结

1.new 的作用

使用了new关键字之后代码中简化了以下(使用new关键字之后会自动省略以下内容)

 (1)、var temp = {}
    
 (2)、temp.__proto__ = 士兵原型

 (3)、this. __proto__ = create士兵.rototype

 (4)、return temp
 
 (5)、 不用写原型(函数名),因为new会默认声明函数名叫prototype

2.new 的约定:

由于new关键字后面的函数是用来创建对象的,所以不必要写士兵前面的create,,只要使用了new,就可以把士兵前面的全部create给去掉

  1. 一个js文件里写一下代码:
    //游戏里面创建100个常规士兵
    //每一个士兵私有属性:id不同、生命值不同
    //每一个士兵共有属性:都会行走、奔跑、死亡、攻击、防御、攻击力一样、都是美国步兵
    
    function 士兵(id){
        this.ID = id,
        this.生命值 = 42
    }
     
    士兵.prototye = {
        constructor:士兵
        行走:function(){/*走两步的代码*/},
        奔跑:function(){/*狂奔的代码*/},
        死亡:function(){/*GO DIE*/},
        防御:function(){/*护脸*/},
        攻击:function(){/*attack*/}
        国家:function(){/*美国*/}
    }
    
  1. 在另一个文件里写调用上面代码的函数:
    var 士兵们 = []
    for(i=0;i<100;i++){
        士兵们.push(new 士兵(i))
    }

3. new 的常见用法解释:

    var object = new Object()

在这里new起了两个作用:

(1)、 new会给object添加自有属性(这里添加了空对象)

(2)、 object. __ proto__ === Object.prototype