SOURCE

/**
 * 函数式
 * 特点:面向过程
 * 缺点:创建了多个全局变量,容易覆盖历史函数或被以后的函数覆盖
 */
// 函数也是全局变量,此时函数里的this表示window(浏览器)

// 重要:函数里的this,表示函数声明时所在的环境对象,全局声明的函数this就是window,对象里声明的函数this就是对象,函数a里的函数b this指向函数a。
function checkName() {

}
function checkEmail() {

}
function checkPassword() {

}

// 对象收编函数
var checkObject = {
    checkName: function() { // 函数里的this代表对象checkObject

    },
    checkEmail: function() {

    },
    checkPassword: function() {

    }
}

// 方法的链式调用
var checkObject = {
    checkName: function() {
        return this // 在方法中返回this,可实现链式调用
    },
    checkEmail: function() {
        return this
    },
    checkPassword: function() {
        return this
    }
}

checkObject.checkName().checkEmail().checkPassword()

// 函数是对象,所以也可以这样声明
var checkObject = function() {}
checkObject.checkName = function() {}
checkObject.checkEmail = function() {}
checkObject.checkPassword = function() {}


// 拷贝对象:创建可被复制的对象,调用此方法产生的每个对象都是独立的,互不影响。
var checkObject = function() {
    return {
        checkName: function() {},
        checkEmail: function() {},
        checkPassword: function() {},
    }
}

// 函数可以作为类
var CheckObject = function() {
    this.checkName = function() {}
    this.checkEmail = function() {}
    this.checkPassword = function() {}
}
var co = new CheckObject() // new创建类的实例对象,相当于执行一遍类的构造函数,并将this上的属性和方法(包括值)赋值给创建的实例。

// 类的原型,将方法添加到原型对象,则实例化后,实例可以继承类的原型方法
// 对象创建时,引擎会给此对象添加__proto__属性(原型链:继承原型属性方法)、函数创建时会添加prototype属性(原型对象:用于设置原型属性方法)
var CheckObject = function() {}
CheckObject.prototype.checkName = function() {}
CheckObject.prototype.checkEmail = function() {}
CheckObject.prototype.checkPassword = function() {}

// 祖类:将方法添加到祖类,则每个函数都会拥有这个方法
Function.prototype.checkName = function() {}
// 尽量不要将有具体实现的方法添加到祖类,只添加与业务无关的通用方法
Function.prototype.addMethod = function(obj) {
    for(let i in obj) {
        this[i] = obj[i]
        this.prototype[i] = obj[i]
    }
}

// m.addMethod({
//     checkName: function() {
//         return this
//     },
//     checkEmail: function() {
//         return this
//     },
// })

// console.log(m.checkName().checkEmail())


var a = function() {}
console.log(a.prototype)
console.log(a.__proto__)
console.log(CheckObject.constructor)

// constructor 的作用是什么?

console 命令行工具 X clear

                    
>
console