Object

187 阅读2分钟

1.封装和继承

  • 构造函数返回一个对象
  • 类返回一个对象
  • 封装:隐藏细节,自己对自己隐藏细节,自己对别人隐藏细节
  • 继承:复用共有部分
  • 多态:同时具有两种或两种以上的属性,div.childNodes(div是Node节点),div.childen(div是元素),div同时是节点和元素,增加灵活性

2.原型链(对象与对象)

2.1 JS的类型

  • 基本类型(存值):number、string、bool、undefined、null、symbol
  • 复杂(引用)类型(存地址): object
    • 普通对象:{name: 'paul'}
    • 数组:下标是字符串 '1', '2', '3'...'length'
    • 函数:一种可执行代码组成的对象

2.2原型链

    var obj1 = {name: a, age: 22}
    var obj2 = {name: b, age: 20}
    console.dir(obj)
    obj1.__proto__ === obj2.__proto__ //地址相同
    obj1.__proto__.gender = 'man' // 原型链中添加属性
    console.log(obj2.gender) // man
    window.Object.prorotype.gender = 'man'
  • 访问__proto__会造成性能降低
  • 数组除了有自己的方法,里引用着对象的方法
  • 函数除了自己的call以及apply,也引用Object

3.this(对象与函数)

3.1 函数就是对象

  • 所谓函数就是一段被eval执行的字符串
var obj = {
    name: 'hololo',
    length: 2,
    params: ['x', 'y'],
    functionBody: 'console.log("hello hololo")'
}
objBaBa = {
    call: function(x) {
        eval(x.functionBody)   // eval执行字符串
    }
}
obj.__proto__ = objBaBa
boj.call(obj)   // hello hololo
  • 运行环境猜测函数操作的对象,这就是this
    • 谁调用,this就是谁
var obj = {
    name: 'hololo',
    sayName: function() {
        console.log('my name is' + this.name)
    }
}
obj.sayName();   // my name is hololo
obj.sayName.call();   // my nem is 
// call第一个参数不传,this就是undefined (严格模式) / window
// call调用时,非严格模式,传入undefined也是window

3.2 this详解

  • this本质上就是一个参数,被默认处理了,隐式传this
  • 参数的值只有在传参时才能确定
  • call调用时,this是第一个参数
  • this的值只有在传参的时候才能确定
  • 箭头函数里的this是定义时外部的this,且call的第一个参数失效,传何值都一样
  • JS 中对象函数没有关系,JS 之父通过 this 强行使得它们有关系。
  • obj.fn.call(obj, 1,2,3) => obj.fn(1,2,3)

4.bind用法

  • 创建一个新的函数,call原来的函数

5.new用法

6.继承的写法