Skip to content

1.1.工厂模式

工厂模式:每次返回的都是一个对象。优点:只需要传参数,不管其如何实现的。缺点:想添加类型时,必须修改原产品模型。

  • 理解原型 Object 和Function都是js自带函数,Object继承自己,Function继承自己,相互继承对方,即Object和Function即是函数也是对象
Function instanceof Object //true
Object instanceof Function //true

Function.prototype // f(){[native code]} 指向函数f() 本身
Object.prototype // Object
  • 理解原型链

JS中所有的函数对象,都有一个 prototype属性,对应当前对象的原型,但普通对象没有,而 prototype属性下还有一个 constructor,指向这个函数。

let p ={}
p.prototype //undefined
function f() {}
f.prototype //object {constructor: f}
  • _proto 只有ff和chrome浏览器支持 JS中所有的对象,都有一个 _proto_属性,指向实例对象的构造函数原型(由于 _proto_是个非标准属性,因此只有ff和chrome两个浏览器支持,标准方法是 Object.getPrototypeOf())。
let p = new Person()
p._proto_ === Person.prototype
 function Person(name, age) {
        var obj = new Object()
        obj.name = name
        obj.age = age
        obj.fn = function () {
            return this.name
        }
        return obj
    }
    var p = Person('jack', 20)

1.2.构造函数模式

var action = {
    fn: function() {
        return 1
    }
}
function Person(name, age) {
    this.name = name
    this.age = age
    this.fn = action.fn
}
var p = new Person('jack', 20)

1.3.原型模式

function Person(name, age) {

    this.name = name
    this.age = age

}
Person.prototype = {
    constructor: Person, //注意这里一定要手动绑定
    run: function() {
        return 1
    }
}

var p = new Person('jack', 20)

1.4.构造函数,构造函数的原型对象,实例化对象三者关系

function Person(name, age) {

        this.name = name
        this.age = age

    }
    Person.prototype = {
        constructor: Person, //注意这里一定要手动绑定
        run: function() {
            return 1
        }
    }

    var p = new Person('jack', 20)

    // Person 构造函数
    // Person.prototype 构造函数的原型对象
    // p 实例化对象
    p.__proto__ === Person.prototype //一个Person的原型{}
    p.constructor === Person   //指向一个函数 用来检测是否属于一个类
    Person.prototype //一个Person的原型{}

2.1构造函数的继承(组合式继承)

function Person(name,age) {
    this.name = name
    this.age = age
}
Person.prototype.firends = [1,2,4]
function Student(name) {
    Person.call(this,name)
}
Student.prototype = Object.assign({},Person.prototype)
Student.prototype.constructor = Student;

3.1 ES6类的概念

class Person{
    constructor(name) {
        this.name = name
    }
    getName() {
        return this.name
    }
}
let p =new Person('jack')

class Child extends Person {
     constructor() {
        super()
    }
}