/**
* 函数式
* 特点:面向过程
* 缺点:创建了多个全局变量,容易覆盖历史函数或被以后的函数覆盖
*/
// 函数也是全局变量,此时函数里的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