原型和原型链

Posted by Zxd on July 23, 2018

1. 构造函数

1
2
3
4
5
6
7
8
function Foo(name,age){
this.name = name
this.age = age
this.class= 'class-1'
//return this // 默认有这一行
}
var f = new Foo('zhangsan',20)
//var f1 = new Foo('lisi',22) // 创建多个对象

构造函数-扩展

  • var a = {}其实是var a = new Object()的语法糖
  • var a = []其实是var a = new Array()的语法糖
  • function Foo(){...}其实是var Foo = new Function(...)
  • 使用instanceof判断一个函数是否是一个变量的构造函数
1
判断一个变量是否为数组: 变量 instanceof Array

2.原型规则和示例

5条原型规则

  1. 所有的引用类型(数组,对象,函数), 都具有对象特性,即可自由扩展属性(除了’null’以外)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var obj = {} ; obj.a = 100
    var arr = [] ; arr.a = 100
    function fn(){} ; fn.a = 100

    console.log(obj.__proto__)
    console.log(arr.__proto__)
    console.log(fn.__proto__)

    console.log(fn.prototype)

    console.log(obj.__proto__===Object.prototype)
  2. 所有的引用类型(数组,对象,函数), 都有一个proto属性(隐式原型),属性值是一个普通的对象

  3. 所有的函数,都有一个prototype属性(显示原型),属性值也是一个普通的对象
  4. 所有的引用类型(数组,对象,函数),__proto__属性值指向它的构造函数的prototype属性值
  5. 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的proto中寻找
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 构造函数
    function Foo(name,age){
    this.name = name
    }

    Foo.prototype.alertName = function(){
    alert(this.name)
    }
    // 创建示例
    var f = new Foo('zhangsan')
    f.printName = function(){
    console.log(this.name)
    }
    // 测试
    f.printName()
    f.alertName()
    f.toString() // 要去f.__proto__.__proto__中去查找

img