js 原型和原型链

原型

1.定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以継承该原型的属性和方法。原型也是对象。

   /***1.定义***/

    Person.prototype.name = "hehe"
    Person.prototype.say = function() {
      console.log('hehe')
    }
    function Person() {
    }
    var person = new Person
    var person1 = new Person  //継承该原型的属性和方法
    

2.利用原型特点和概念,可以提取共有属性。
*原型的增删改查(只能在原型的本身上进行)

// 原先:
function Car(color,owner){  //每一执行都会执行,代码藕合
  this.height=1200;
  this.color=color;
  this.lang= 4900;
  this.owner = owner;
  this.name = 'bmw'
}

var car = new Car("red","lili")
var car1 = new Car('black','xuming')

// 使用原型:
Car.prototype.height=1200;
Car.prototype.lang= 4900;
Car.prototypename = 'bmw'

3.对象如何査看对象的构造函数一> constructor
(构造器,会返回对象的构造函数)–查找自己的本身的构造函数
*(虽然是系统自带的,但是我们是可以自己更改的)

更改:
 Person.prototype = {
        constructor: Car
      }
      function Car() {
      }
      var car = new Car

4.对象如何査看原型一>隐形属性_ proto_
*访问对象的时候如果不存在的会回顺着_ proto_的索引去找原型,相当与连接的关系,指向原型也就是链接原型的作用

*补充知识点:
用构造函数创建对象时,new的行为
用构造函数创建对象:
var obj=new 类型名(属性值,…)
new: 4件事:

  1. 创建一个空对象
  2. 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构造函数的原型对象)
  3. 调用构造函数:
      1. this->new
      2. this.属性名=值: 通过强行赋值的方式,为对象添加新属性,并保存属性值
  4. 返回新对象的地址,保存在变量中
     function Penson() {
       // var this = {
       //   __proto__:Person.prototype   //new新对象的时候发生4段式,第一,二步
       // }
     }

     var penson = new Person()

在这里插入图片描述

原型链

1.如果构造原型链

Grand.prototype.__proto__ = 	Object.prototype(大部分对象的最终原型) ---测试Object.prototype.__proto__ = null

Grand.prototype.lastName ="Deng"
function Grand(){
}
var grand = new Grand();

Father.prototype=grand 
function Father(){
}
var father= new Father();

Son.prototype=father
function Son(){
}
var son= new Son();

这样一层层的向上查询的过程就是原型链
原型加原型,把原型连成链的,访问的顺序依照链的顺序,像作用链一样的访问顺序,可近的来的过程

2.原型链上属性的增删改查
(与原型一直)–通过子孙进行删除是不可能的,只有自己本身

Father.prototype=grand 
function Father(){
this.num = 100
}
var father= new Father();

Son.prototype=father
function Son(){
}
var son= new Son();

son.num++

3.绝大多数对象的最终都会继承自Object.prototype —null
因为4,在自己创建Object.create(null) 就没有原型

4.Object.create(原型)—可以自己创建原型(必须是对象或者null)

创建对象并且原型自己指定
var obj = {name:"sunny",age:123}
var obj1=Object.create(obj)

5.那 Object.prototype 的原型呢?

Object.prototype.__proto__ === null

引用阮一峰老师的 《undefined与null的区别》 就是:

null 表示“没有对象”,即该处不应该有值

所以 Object.prototype.proto 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

所以查找属性的时候查到 Object.prototype 就可以停止查找了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值