js原型的本质

  • 1.既然我们可以使用构造函数就可以定义属性和方法,为什么还要原型呢??

一般每个实例的属性是不一样的,而行为一般都是一样的,所以我们希望每次实例化的时候,只分配内存保存不一样的数据,所有的实例共享这些方法,那就需要原型对象

  • 原型对象本质: 原型对象的属性和方法可以被所有实例共享
    这样,如果我们需要修改所有实例中的属性或者方法,就只需要修改一处,就能够影响到所有实例了。

  • 一般将大家都公有的东西放在原型对象中 每个实例独特的不一样的属性放在构造函数中

  • 属性屏蔽理论:因为当我们调用一个函数的方法和属性时,先在函数本身里面寻找,找不到就会在函数的原型对象里寻找,如果原型对象中和构造函数中有相同的属性的话,就会显示构造函数中的属性。
    我们想访问原型中的被屏蔽掉的属性有两种方法:
    1.delete
    2.使用Product.prototype.属性或者方法名称

function Product(){
        this.name='神仙';
        this.description = ''
        this.buy = function(){
            alert('构造函数对象')
        }
    }

       Product.prototype={
           name:'魔鬼',
           buy:function(){
               alert('原型对象')
           }
       }

       var product = new Product()
       console.log(product.name)  // 神仙

       /*清除构造函数中的name*/
       delete product.name  // 清除后显示原型对象中的name属性
       console.log(product.name) // 魔鬼
       product.name='魔鬼2'  // 再次给name赋值
       console.log(product.name) // 魔鬼2

       /*没有清除之前,也可以用这种Product.prototype.buy()式来获取原型方法*/
       product.buy(); // 构造函数对象
       Product.prototype.buy();  // 原型对象
       console.log(product.buy) // function (){alert('构造函数对象')}

       /*清除*/
       delete product.buy
       console.log(product.buy) //function (){alert('原型对象')}
       product.buy(); // 原型对象
  • 通过原型创建对象,其实创建的是两个对象 构造函数对象 原型对象
    当我们实例化的时候,该实例自动拷贝构造函数的所有属性和方法,而对于原型对象,则不拷贝,而是通过一个属性‘铁链’.

  • 那么既然实例不拷贝原型中的属性方法,如何访问到其属性呢??
    隐藏的两个属性:
    contructor,其值是构造函数

  • 属性访问搜索法则:
    首先遍历自己的属性(从构造函数拷贝过来的属性),如果找到就返回
    如果没找到,就根据铁链寻找到原型对象,依次遍历原型对象中的属性,如果找到同名的属性就返回,就这么简单。(原型链)

  • 实例属性和原型属性判断
    hasOwnProperty() 方法
    可以判定一个属性是存在于构造对象的实例上还是原型对象上。该 方法继承自 Object。
    如果是实例对象—ture
    如果是原型对象 – false

  • 引用类型和值类型区别
    内存分配机制不一样
    引用类型:创建一个变量—内存中保存的是变量真实入口的地址
    值类型:创建一个变量,内存创建一个区域 说白了就是引用类型会分配两个区域:一个保存地址,一个保存内容

    变量赋值是否的区别
    将一个值类型赋值给另一个变量,实际上新创建一个区域 引用类型,只是创建一个区域,保存另一个变量的入口地址

猜你喜欢

转载自blog.csdn.net/u011067966/article/details/77435311
今日推荐