Skip to content

构造函数设计模式 类&实例 私有&公有属性方法 插件组件封装

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 // true
js
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)