面向对象细节知识点汇总

基本包装类型:

基本类型:字符串+数值+null+undefined +布尔值;
为了便于操作基本类型,ECMAScript提供了三个特殊的引用类型:Boolean+Number+String。
基本类型值并不是对象,因此逻辑上讨论他们不应该有属性和方法,内部的具体处理:

  • 创建String类型的一个实例对象
  • 在实例对象上面读取指定的属性(length),调用指定的方法(subString)
  • 销毁该对象
  1. 创建字符串对象:String是字符串的对象包装类型。
    var st1 = new String('demo1') ;
    console.log(st1);//String {0: "d", 1: "e", 2: "m", 3: "o", 4: "1", 
    length: 5, [[PrimitiveValue]]: "demo1"}
    console.log(typeof st1);//object
    var st2 = 'demo';
    console.log(typeof st2);//string
    var st3 = String('demo');
    console.log(typeof st3);//string
  1. 创建数值对象:Number是与数字值相对应的引用类型。
    var num1 = new Number(10);
    console.log(typeof num1);// object
    console.log(num1);//Number {[[PrimitiveValue]]: 10}
    var num2 = 10;
    console.log(typeof num2);// number
    console.log(num2);//10
    var num3 = Number(10);
    console.log(typeof num3);// number
    console.log(num3);//10
  1. 创建布尔对象:Boolean是与布尔值对象的引用类型。
    var boo1 = new Boolean(true); // object
    var boo2 = true; // boolean
    var boo3 = Boolean(true); // boolean
  1. 特殊的方法创建
    var st4 = new Object('demo');
    var num4 = new Object(10);
    var boo4 = new Object(true);

注意点:

  1. 对象还是基本数据类型值?
    对象:通过new调用构造函数创建出来的是对象;
    基本数据类型值:通过字面量方式赋值 |通过省略new 关键字调用构造函数方式创建的是基本数据类型值。
   var str1 = new String('hello');
    var str2 = 'hello';
    var str3 = String('hello');
    说明:以上代码中,str1是对象,而str2和str3是字符串(基本数据类型值)
  1. 相等问题
    基本类型值判断相等==》值相等
    引用类型值判断相等==》值相等且引用相等
    var str1 = '这是一个字符串';           //基本数据类型
    var str2 = String('这是一个字符串');   //基本数据类型
    console.log(str1 == str2);        //true 相等
    var str3 = new String('这是一个字符串');  //引用类型-对象
    console.log(str1 == str3);    //true    //值相等
    console.log(str2 == str3);    //true    //值相等

    console.log(str1 === str3);    //false  //值相等,但是引用不相等
    console.log(str2 === str3);    //false  //值相等,但是引用不相等
    //判断下面的变量是否相等
    var num1 = 10;                  //基本数据类型
    var num2 = new Number(10);      //对象
    console.log(num1 == num2);      //true
    console.log(num1 ===  num2);    //false

    var bool1 = true;    //基本数据类型
    var bool2 = new Boolean(true); //对象
    console.log(bool1 == bool2);    //true
    console.log(bool1 === bool2);   //false
this

函数调用方式发生改变会导致this的指向发生改变。

  1. 函数作为对象的方法调用 this-->当前的对象
 var obj = {
        name : 'zs',
        showName : function () {
            console.log(this);
        }
    }
    obj.showName(); // this->obj
  1. 函数作为普通函数调用 this-->window
 var obj = {
        name : 'zs',
        showName : function () {
            console.log(this);
        }
    }
   var showName = obj.showName;
    showName(); // this->window
  1. 使用new构造函数调用 this-->构造函数内部新创建的对象
 function Person() {
        console.log(this);
    }
    var p1 = new Person();
  1. 使用call |apply 调用个(函数上下文调用) this-->第一个参数
 var obj = {
        name : 'zs',
        showName : function (p1,p2) {
            console.log(this,p1,p2);
        }
    }
    var o = {};
    obj.showName.call(o,1,2);
Object.prototype
  1. constructor 指向对象的构造函数
  2. hasOwnProperty 判断某个对象中是否有某个属性(实例)
  3. isPrototypeOf 判断某个对象是否是指定对象的原型对象(判断是整一条原型链)
  4. prototypeIsEnumerable 是否可枚举,如果可以枚举,就能够通过for···in 遍历
  5. toString 返回对象的字符串描述信息
    1. 基本包装类型(String Number Boolean),返回对应的基本数据类型的字符串;
    2. object 类型的对象,返回[ object object ];
    3. 数组或者函数,返回对应的字符串形式;
    4. Number 对象可以传参,表示进制转换。
  6. toLocalString 一般情况下和toString用法一样,特殊情况下会做本地化处理
  7. valueOf 返回对应的值
    1. 基本包装类型,返回对应的基本数据类型
    2. object 类型。返回是对应本身
      3.日期对象,返回时间戳
成员:属性+方法

静态成员:构造函数也是一个对象,也有自己的属性和方法。
实例成员:直接定义在对象身上的属性和方法。
原型成员:定义在原型对象上的属性和方法。

Object的静态成员
  1. Object.apply 借用其他对象的方法
  2. Object.arguments 接受实参,保存实参
  3. Object.assign 属性拷贝
  4. Object.call 借用其他对象的方法
  5. Object.caller 返回值是一个函数,返回调用函数的函数,如果在全局作用域中调用,返回null不是window
function fun1() {
    console.log(fun1.caller); // 返回调用函数的函数
}
function fun2() {
    fun1();
}
    fun2();//function fun2() {fun1();}
  1. Object.constructor 指向构造函数
  2. Object.create 创建对象 并且设置这个对象的原型对象
  3. Object.getOwnPropertyDescriptor 获取实例属性的描述信息

    configurable 是否可配置(01是否可删除02是否可以修改该配置)
    enumerable 是否可枚举 可以枚举就是可以通过for..in遍历
    value 属性的值
    writable 是否可重写(修改)

  4. Object.defineProperty 定义属性并设置属性的描述对象
    1>.如果该属性已经存在,默认是true
    2>.如果定义一个新的属性,默认是false
  5. Object.getOwnPropertyNames 获取对象所有实例属性的名字,返回一个数组,不能获取原型属性
  6. Object.keys 获取对象所有属性的名字,不能获取原型属性和不可以枚举的属性
  7. Object.getPrototypeOf 获取原型对象
  8. Object.preventExtensions | Object.isExtensible
    禁止扩展,不可以添加属性,但是可以修改属性也可以删除
  9. Object.seal | Object.isSealed密封对象 禁止扩展,不能删除,可以修改
  10. Object.freeze | Object.isFrozen冻结对象 禁止扩展 禁止删除 禁止修改
function 构造函数的使用
  • 创建函数的方法:
  1. 直接声明一个函数
  2. 函数表达式
  3. 使用new
  4. 使用new Function
 var fun4 = new Function('a','b','console.log(a+b);');
    // 如果没有传参数,是空函数,没有函数体
    // 如果只有一个参数,这个参数就是函数体
    // 如果有多个参数,最后一个才是函数体,其他的是形参列表

处理参数过长解决问题

  1. 使用+拼接字符串
  2. 使用反括号``
  3. 使用JS模板

小应用:
去重:返回一个数组,数组中的元素不重复
tips:返回数组中某个元素的索引,如果该元素不存在,返回-1


求最大值:逐一比较大小,每次比较后保存较大值并赋值给MaxNum

 function getMaxNum() {

        var maxNum = arguments[0];

        for (var i = 1; i < arguments.length; i++) {
            if(maxNum < arguments[i]){
                maxNum = arguments[i];
            }
        }

        return maxNum;
    }

arguments:是一个类似数组的对象,对应于传递给函数的参数,除了 长度之外没有任何数组属性。
实参和形参:

  1. 在函数调用的时候,默认会把实参复制给形参,并且把实参保存在arguments中;
  2. 实参的个数大于形参的时候,超出的可以通过arguments获取;
  3. 实参个数小于形参,会依次赋值,多余的形参是undefined
    arguments.length: 实参的长度
    函数名.length:形参的长度
    callee和caller
    caller : 返回一个函数,返回调用当前函数的函数,如果函数是在全局作用域中调用,返回 null
   function f1() {
     console.log(f1.caller); // 返回调用函数的函数
        console.log(arguments.callee);// 返回函数自身
    }
    function f2() {
        f1();
    }
  f2();
Function.prototype原型链

Object 和Function

  1. 所有的对象都是继承Object
  2. Object和Function互为对方的实例
    console.log(Object instanceof Function); // true
    console.log(Object instanceof Object); // true
    console.log(Function instanceof Function); // true
    console.log(Function instanceof Object); // true
eval 函数

作用:可以把字符串转为对应的JS代码

eval('var o = 10');
console.log(o);

eval 和 Function区别和联系:
1. 都可以把字符串转为对应的JS代码;
2. eval转为代码后直接执行,Function需要调用才会执行。
eval 用于处理JSON数据

  var JSONdate = '{"name":"zs"}';
//    var o = {"name" : "zs"};
    eval('var o =' + JSONdate);
    console.log(o);
    ({"name" : "zs"});
//    eval('(' +JSONdate + ')');

JSON数据:一种数据结构,用来表示数据,传输数据,本质是个字符串。
JSON数据的Key必须使用双引号包裹
处理JSON 数据:
1. 把json数据转为对象;
2.把对象转为JSON数据。

    var a = 10;
    var JSONdate = '{"name":"zs"}';
//    // 1. 把json数据转为对象
//    var o = JSON.parse(JSONdate);
//    // 2.把对象转为JSON数据
//    var str = JSON.stringify(o);
//    console.log(str);

建议:不建议使用(JS是词法作用域,eval函数可以动态的调整(破坏)词法作用域,性能不好)

with :

可以把变量的作用域引申到{}中,用来减少代码的.
使用的注意点:
1.不能使用无前缀的方式添加属性
2.this 指向window
3.在严格模式下,禁止使用
场合:当需要引用深层次的对象时可以缩短代码(对象.属性.属性....)
建议:不建议使用.

  var div =document.getElementById('demo');
    div.style.background = 'red';
    div.style.width = '100px';
    div.style.height = '100px';

//    with(div.style){
//        background = 'red';
//        width = '100px';
//        height = '100px';
//    }
    // 使用即时调用函数替代with
    (function (t) {
        t.background = 'red';
        t.width = '100px';
        t.height = '100px';
    })(div.style);

私有变量和私有函数:
直接写在构造函数内部的变量和函数成为私有变量和私有函数。

 function Person(name,age) {
        //对象
        this.name = name;
        this.age = age;
        this.showName = function () {
            console.log(this.name);
        }
        var a = 10
        function  demo() {
            console.log("111");
        }
        //特权方法:像test这样的实例方法,可以访问私有变量函数,这个方法成为特权方法
        this.test= function () {
            return a ;
        }
    }

你可能感兴趣的:(面向对象细节知识点汇总)