zoukankan      html  css  js  c++  java
  • JS对象与原型链

    每个函数都存在一个prototype的属性,然后这个属性值为一个对象,我们称之为原型对象

    每个对象都存在着一个隐藏的属性"__proto__" 这个属性引用了创建这个对象的函数的prototype

    1:Object对象是由Function函数创建的
    Object.__proto__ == Function.prototype
    
    2:Object的原型对象指向空
    Object.prototype.__proto__ == null 
    
    3:Function对象由他自己本身创建
    Function.prototype == Function.__proto__
    
    4:其他的普通对象最终指向的都是Object
    Function.prototype.__proto__ == Object.prototype

    一:Object原型对象上面的属性

    1:Constructor:保存着创建当前对象的函数;
    
    2:hasOwnProperty(propertyName):检查属性是否在当前对象实例中,而不是在实例的原型中,且参数必须以字符串的形式指定     红
    
    3:isPrototypeOf:测试一个对象是否存在于另一个对象的原型链上;
    
    4:propertyIsEnumerable:某个属性是否能够使用for...in语句来枚举
    
    5:toLocaleString:返回一个该对象的字符串表示,该字符串与执行环境的地区对应;
    
    6:toString:返回对象的字符串表示;
    
    7:valueOf:返回对象的字符串,数值,或者布尔值表示,通常与toString方法的返回值相同。
    
    8:__defineGetter__:
    
    9:__defineSetter__:
    
    10:__lookupGetter__:
    
    11:__lookupSetter__:
    
    12:get __proto__:
    
    13:set __proto__:

    二:Object函数与Function本身拥有的属性

    Object函数拥有的方法
    
    1:assign() 将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象
    const object2 = Object.assign({c: 4, d: 5}, object1);
    
    2:create() 使用现有的对象来提供新创建的对象的__proto__
    const person = {
      isHuman: false,
      printIntroduction: function () {
        console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
      }
    };
    
    const me = Object.create(person);
    
    3:defineProperties 在一个对象上定义新的属性或修改现有属性,并返回该对象
    Object.defineProperties(obj, props)
    
    4:defineProperty 法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象
    Object.defineProperty(obj, prop, descriptor)
    
    5:entries 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)
    const object1 = { foo: 'bar', baz: 42 };
    console.log(Object.entries(object1)[1]);
    
    6:freeze 方法可以冻结一个对象 冻结指的是不能向这个对象添加新的属性,修改现有的属性
    const object1 = {
      property1: 42
    };
    
    const object2 = Object.freeze(object1);
    
    7:getOwnPropertyNames 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
    
    8:getOwnPropertySymbols 方法返回一个给定对象自身的所有 Symbol 属性的数组
    
    9:getPrototypeOf 方法返回指定对象的原型
    
    10:keys 会返回一个由一个给定对象的自身可枚举属性组成的数组
    1:arguments 表传入函数的实参,它是一个类数组对象
        function.arguments 已经被废弃了, 现在推荐的做法是使用函数内部可用的 arguments 对象来访问函数的实参
    
    2:caller 返回调用指定函数的函数   
    该属性的常用形式arguments.callee.caller替代了被废弃的 arguments.caller
    
    3:displayName 获取函数的显示名称
    
    4:length  指明函数的形参个数
    本来应该传递的参数的个数
    实际传递的:arguments.length 是函数被调用时实际传参的个数
    
    5:name 返回函数实例的名称
    
    6:apply 调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数
    func.apply(thisArg, [argsArray])
    
    7:call 调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)
    fun.call(thisArg, arg1, arg2, ...)
    
    8:bind 创建一个新的函数,新函数与被调函数(绑定函数的目标函数)具有相同的函数体, 当被调用时,将其this关键字设置为提供的值
    fun.bind(thisArg[, arg1[, arg2[, ...]]])

    三:原型链

    var obj = {}
    obj.__proto__ == Object.prototype
    
    function mySelf(){
    }
    var a = new mySelf()
    a.__proto__ == mySelf.prototype
    mySelf.prototype.__proto__ == Object.prototype
    mySelf.__proto__ == Function.prototype
    Object.prototype.__proto__ == null
    Function.prototype.__proto__ == Object.prototype

    四:对象的属性

    let obj = {
        name:'panrui',
        age:24
    }
    console.log(obj)
    注释:
    1对象本身所拥有的属性,或者从原型链上去继承的属性
    2属性当中可枚举的属性 通过for...in可遍历出来的,以及不可枚举的属性
    3属性当中又分为key为Symbol的和不为Symbol的属性

    五:Instanceof的判断

    A Instanceof B

    Instanceof的判断队则是:沿着A的__proto__这条线来找同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false

    isPrototypeOf:isPrototypeOf() 与 instanceof 运算符不同。在表达式 "object instanceof AFunction"中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身

    Baz.prototype.isPrototypeOf(baz)  验证baz是不是在Baz的原型链上面

    似乎规则和上面的相反

    不忘初心,不负梦想
  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/panrui1994/p/9396935.html
Copyright © 2011-2022 走看看