Appearance
构造函数设计模式 类&实例 私有&公有属性方法 插件组件封装
new Fn(10, 20) / new Fn 区别在于不能传递实参以及运算时优先级问题,只要有new,不管加不加括号,都会执行 1.首先也会像普通函数执行一样,形成EC(FN) 2.私有上下文产生后,进来的第一件事,创建这个类的实例对象 3.初始化作用域链,初始化this,this指向创建的实例对象,初始化arguments,形参赋值,变量提升 4.代码执行 this.xxx = xxx都是给当前实例对象设置的私有属性和方法 5.如果函数没有写返回值,或者返回的是原始值类型的值,默认都是把创建的实例对象返回。 如果返回的是引用类型值,才是以自己返回的为主
基本数据类型在js中的特殊性 1.一定是自己所属类的实例 2.不一定是对象数据类型
js
let m = 10 // 所以m能调用Number原型上的方法
m instanceof Number // false,但是m是Number的实例,这是instanceof的局限性,它要求实例必须是对象
let m2 = new Number('10')
m2 instanceof Number // truejs
class Person {
// 构造器,初始化实例中的属性
constructor (name) {
this.name = name
}
// 原型上的公共方法
sayHello () {
console.log('Hello')
}
// 实例上的方法(=)
eat = () => {
console.log('eat')
}
// 实例上的私有属性(=)
gender = '男'
// 静态属性,构造函数上的 => Person.gender
static gender = '男'
// 静态方法, 构造函数上的 => Person.run()
static run () {
console.log('run')
}
// get方法 <=> Object.define.property
get name () {
console.log('get')
}
set name (val) {
console.log('set')
return this.name = val
}
}
// example
function Fn (n) {
let m = 10
this.total = n + m
this.say = function () {
console.log(this.total)
}
}
let f1 = new Fn(10)
let f2 = new Fn(20)
let f3 = new Fn
console.log(f1.m)
console.log(f2.n)
console.log(f1.total)
f2.say()
console.log(f1 === f2)