zoukankan      html  css  js  c++  java
  • JS三座大山_原型与原型链

    原型与原型链

    原型模式

    • JS是一门基于原型模式的语言
    • 原型模式用于创建重复的对象,性能较高,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    • 该模式实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式的目的是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,即:用已有的一个原型对象,可以快速生成和原型对象一样的新对象实例

    原型

    一个可以被复制(克隆)的类,通过复制原型可以创建一个一模一样的新对象,也可以说原型就是一个模板,在设计语言中更准确的说是一个对象模板

    • 原型定义了一些公用的属性和方法,利用原型创建出来的新对象实例会共享原型的所有属性和方法
    var Person = function(name){
        this.name = name
    }
    Person.prototype.sayHello = function(){
        console.log(this.name + ', hello')
    }
    var person1 = new Person('laozhang')
    var person2 = new Person('laowang')
    
    person1.sayHello()
    person2.sayHello()
    
    • 通过原型创建的新对象实例是相互独立的,为新对象实例添加的方法只有该实例拥有这个方法,其他的实例没有这个方法
    • 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
    • 所有的构造函数都有一个prototype(原型)属性,prototype也是一个对象,指向了当前构造函数的引用地址
    • 所有引用类型的__proto__属性指向它构造函数的prototype
    • 非构造函数实例化出来的对象或者对象的prototype指向Object的prototype,Object的prototype指向null
    • 所有的原型对象都会自动获取一个constructor(构造函数)属性,这个属性(是一个指针)指向prototype属性所在的函数:即Person

    原型链

    原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会现在这个对象本身属性上查找,如果找不到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构

    hasOwnProperty函数

    用来检查对象自身是否含有某个属性,返回值是布尔值,当属性不存在时不会向上查找原型对象的原型链,hasOwnProperty是JavaScript中唯一一个处理属性但是不查找原型链的函数

    getOwnPropertyNames函数

    可以获取所有的自身属性,返回值是由对象自身属性名称组成的数组,同样不会向上查找对象的原型链

    JS的原型是为了实现对象间的联系,解决构造函数无法数据共享而引入的一个属性,而原型链是一个实现对象间联系即继承的主要方法

    谈谈你对原型的理解

    在JS中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中么个函数对象都有一个prototype属性,这个属性指向函数的原型对象,使用原型对象的好处是所有对象实例共享它所包含的属性和方法

    什么事原型链?原型链解决的是什么问题?

    • 原型链解决的主要是继承问题
    • 每个对象拥有一个原型对象,通过proto指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向null(Object.prototype.__prpto__指向的是null)。这种关系被称为原型链,通过原型链一个对象可以拥有定义在其他对象中的属性和方法

    prototype prpto 和 constructor关系

    • prototype是构造函数的属性
    • __proto__是每个实例都有的属性,可以访问prototype属性
    • 实例的__proto__与其构造函数的prototype指向的是同一个对象
    • 原型对象(即:构造函数.prototype)有一个constructor属性指向构造函数本身
  • 相关阅读:
    python面试
    Python 3.x--使用re模块,实现计算器运算实例
    Python 3.x--模块导入
    Python 3.x--序列化及反序列化
    Python 3.x--装饰器
    Python 3.x--函数的参数问题
    Python 3.x--文件seek、tell的用法
    Python 3.x--字典循环
    Python3.x--文件读写与list
    Python简介
  • 原文地址:https://www.cnblogs.com/nanhuaqiushui/p/14406090.html
Copyright © 2011-2022 走看看