zoukankan      html  css  js  c++  java
  • JavaScript基础概念之----原型/原型链

    原型只是一个被称为“原型”的空对象属性。所有的函数都是由Function()构造函数创建的。当创建函数实例时,它总是拥有一个prototype属性,这是一个空对象。

    prototype属性来自Function()构造函数。

    prototype属性是JavaScript为每个Function()实例创建的一个对象,它通过new关键字创建的对象实例链接回创建它们的构造函数。

    prototype属性的值可以设置为JavaScript中任何可用的复杂值(对象),JavaScript将忽略任何设置为原始值的prototype属性。

     将构造函数创建的实例链接于构造函数的prototype属性,意味着 任何时候使用new关键字创建对象时,它都会在创建的对象实例和创建对象的构造函数的prototype属性之间添加一个隐藏的链接。该链接在实例中被称为 __proto__

    var my = new Array();
    
    my.constructor === Array
    my.constructor.prototype === Array.prototype
    my.__proto__ === Array.prototype

    Array.prototype.constructor == Array

    由于prototype属性是一个对象,因此原型链或查找中的最后一站是Object.prototype。

    var my = [];
    console.log(my.foo);
    
    //先在my对象中查找foo
    //如果没有找到,再到Array.prototype中查找
    //如果没有找到,再到Object.prototype中查找 
    //如果也没有找到,则返回undefined

    与作用域链一样,原型链在链查找时将使用它找到的第一个值。

    Object.prototype.foo = 1;
    Array.prototype.foo = 2;
    var my = [];
    
    console.log(my.foo)//输出2,在Array.prototype.foo上查找到
    
    my.foo = 3;
    console.log(my.foo)//输出3,在my.foo上查找到

    使用新对象替换prototype属性会删除默认构造函数(constructor)属性,除非手动指定一个。

    var Foo = function(){}
    Foo.prototype = {}
    var myFoo = new Foo();
    //myFoo.constructor !== Foo
    //myFoo.constructor 为Object(),而非Foo()
    
    var Bar = function(){}
    var myBar = new Bar()
    //myBar.constructor === Bar
    //myBar.constructor 为Bar()
    
    var Hea = function(){}
    Hea.prototype = {  constructor:Hea }
    var myHea = new Hea()
    //myHea.constructor === Hea
    //myHea.constructor 为Hea()

    prototype属性是动态的。实例总是能从原型获得最新的值,不管何时被实例化、更改、附加。

    var Foo = function(){}
    Foo.prototype.x = 1
    var my = new Foo()
    //my.x 输出1
    
    Foo.prototype.x = 2
    //my.x 输出2

    创建一个实例时,该实例将在实例化时被绑定到“刚完成的”原型。提供一个新对象作为prototype属性,不会更新已创建的实例和新原型之间的连接。一旦开始创建实例,就不应该用一个新对象来替换对象的原型。

    var Foo = function(){}
    Foo.prototype.x = 1;
    var my = new Foo(); //my.x 输出1 //使用新对象覆盖Foo的原型 Foo.prototype = { x:2 } //my.x 还是输出1,my依然引用的是初始化时的原型对象 var bar = new Foo(); //bar.x 输出2 新对象实例bar引用的是新原型对象
  • 相关阅读:
    随便说说辞职后
    用Excel的VBA实现文本匹配与替换
    [转]为什么你做不到呢?
    [转]女生,你为什么不沉住气奋斗?
    写在互联网分析的前面
    回归白领的生活
    NSSortDescriptor:对NSDictionary的NSArray进行排序
    本团队推荐:大神开发的仿原神风格ue5开发MMOARPG核心战斗系统
    UE4外包团队:UE4开发元宇宙项目 UE5开发元宇宙或最佳?
    元宇宙外包团队:Unity开发元宇宙应用,在元宇宙里里Unity扮演什么角色?
  • 原文地址:https://www.cnblogs.com/adhehe/p/9786607.html
Copyright © 2011-2022 走看看