什么是对象、原型对象与原型链

对象
对象基础
对象的定义


对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)。

对象有时被称之为关联数组(associative array)了——对象做了字符串到值的映射,而数组做的是数字到值的映射。

创建一个对象通常先定义初始化变量。

var person = {};
person  // Object {}

点表示法


对象的名字表现为一个命名空间(namespace),它必须写在第一位-----当你想访问对象内部的属性或方法时,然后是一个点(.),紧接着是你想要访问的项目,标识可以是简单属性的名字(name),或者是数组属性的一个子元素,又或者是对象的调用方法。例如:

person.age
person.interests[1]
person.bar()

子命名空间


可以用一个对象来做另一个对象成员值。例如将name成员

name:['wh','xi'],

改成

name :{
    first : 'wh',
    last : 'xi'
},

这样,我们实际上创建了一个子命名空间,听起来有点复杂,但用起来很简单,你只需要链式的再使用一次点表示法,像这样:

person.name.first
person.name.last

注意:你需要改变你之前的代码,从

name[0]
name[1]

改成

name.first
name.last

否则,你的方法不再有效。

括号表示法
另外一种访问属性的方式是使用括号表示法(bracket notation),替代这样的代码

person.age
person.name.first

使用如下所示的代码:

person['age']
person['name']['first']

这看起来很像访问一个数组的元素,从根本上来说是一回事儿,你使用了关联了值的名字,而不是索引去选择元素。难怪对象有时被称之为关联数组(associative array)了——对象做了字符串到值的映射,而数组做的是数字到值的映射。

原型原型链
原型对象


在JavaScript 中,每当定义一个对象(函数) 时候,对象中都会包含一些预定义的属性。其中函数对象的一个属性就是原型对象 prototype 。注:普通对象没有prototype,但是有_ _ proto _ _ 属性 。

原型对象其实就是普通对象 (Function.prototype 除外,它是函数对象,但它很特殊,他没有prototype 属性(前面说道函数对象都有prototype 属性))。

原型对象是用来做什么的呢?

主要作用是用于继承。举个例子

var person = function(name){
    this.name = name;
};
person.prototype.getName = function(){
    return this.name;
}
var veb = new person('Veblen');
veb.getName(); // Veblen

从这个例子可以看出,通过给person.prototype设置了一个函数对象的属性,那有person实例

function Person() {

}
// 虽然写在注释里,但是你要注意:
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

(例中:veb) 出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。

prototype
每个函数都有一个 prototype 属性,就是我们经常在各种例子中看到的那个 prototype ,比如:
那这个函数的 prototype 属性到底指向的是什么呢?是这个函数的原型吗?

其实,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 person1 和 person2 的原型。

那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。

让我们用一张图表示构造函数和实例原型之间的关系:

构造函数和实例原型的关系图

在这里插入图片描述

在这张图中我们用 Object.prototype 表示实例原型。

原型链


JS 在创建对象(不论是普通对象还是函数对象) 的时候,都有一个叫做   
_ _ proto _ _ 的内置属性,用于指向创建它的函数对象的原型对象 prototype 。

console.log(veb.__proto__ == person.prototype)  //true
同样,person.prototype 对象也有__proto__ 属性,它指向创建它的函数对象(Object)的 prototype
    console.log(person.prototypr.__proto__ Object.prototype)   //true
继续,Object.prototype对象也有__proto__属性,但是它比较特殊,为null
console.log(Object.prototype.__proto__)  //null


我们把这个有_ _ proto _ _ 串起来的直到Object.prototype. _ _proto _ _ 为null的链叫做原型链。

 

js new一个对象的过程

  function mon(name) {
            this.name = name
        }
        var son = new mon()

1、创建一个新对象:son
2、新对象会执行一个[[prototype]]连接

son.__proto__=mon.prototype

3、对象实例和对象的this会绑定起来
4、执行对象中的代码 

 this.name = name

 5、如果函数没有返回值,就是返回新对象

什么是原型链

        function supermarket() {

        }
        supermarket.prototype.product = "salks"

        console.log(supermarket.prototype)

        function shop() {}

        shop.prototype = new supermarket()

        console.log(shop.prototype)

        var person = new shop()

        console.log(person.product)

说明:我并没有在shop中定义product,按理说它应该为空,但是我让shop的原型对象指向supermarket的实例,它就会去supermarket中寻找有没有product属性。
作用:我们可以利用这特性实现类的继承

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火兰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值