深度理解JS对象及原型

对象概述

1.JavaScript中,除了string,number,boolean,null,undefined,其他数据都是对象,甚至包括数组、日期和函数。
2.ECMA-262定义:对象是属性的无序集合,每个属性存放一个原始值、对象或函数,对象是无特定顺序的值的数组
3.对象是一种特殊的数据类型可以包含多个成员,其中分为两种:属性和方法:
属性即封装对象的数据,表示与对象有关的值,用法即对象名.属性名
方法即封装对象的行为,表示对象可以执行的行为或可完成的功能,用法即对象名.方法名();

对象的分类

1.内置对象/原生对象,指JavaScript中本身预定义的对象,由ECMAScript标准定义,由各浏览器厂家来提供实现,如下:
String,Number,Boolean
Object,Function
Array,Date,RegExp,Math
Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError
Global
2.宿主对象(host object) ,指JavaScript运行环境即浏览器提供的对象,由浏览器厂家自定义,具体分为两大类:
1).BOM
2).DOM
3.自定义对象,由用户创建的对象,创建方法如下:
1).对象直接量
由名值对组成的映射表,名值对之间以逗号隔开,名和值之间以冒号隔开,如:
var obj={name:"Horry",age:23}
2).new Object(); 如以下方式:
-利用内置对象,使用new关键字 var obj=new Date();
-添加属性 var obj=new Object(); boj.name="John";obj.age="23";
-若构造方法没有参数,则可以省略()
3).function对象模板
使用function模板批量创建某种类型的多个实例且具备相同的基础属性

利用模板定义对象的属性,对象模板中使用this关键字声明对象的属性


利用模板定义对象的方法,对象模板中使用this关键字声明对象的方法


重写方法,以tostring()方法为例



JavaScript中,this关键字用在方法内,专门引用正在被调用的方法当前所在的对象


对象的属性

  一个对象可以声明若干个属性



通过对象的引用、使用. 或[]运算符来访问对象的属性


遍历属性,通过for...in循环遍历对象内的所有属性


属性访问错误
若读取一个本身就不存在的属性,以及属性值是undefined的属性,那么返回值也是undefined



检测属性是否存在:
1.使用in关键字 :console.log("ename"  in emp1);
2.使用对象的hasOwnProperty();方法 :console.log(emp1.hasOwnProperty("ename"));
3.使用undefined判断 :console.log(emp1.ename === undefined);
4.在条件语句中直接判断,如if(emp1.ename){...}


对象的方法

方法即指对象可以实施的行为或完成的功能
方法的调用一般通过对象的引用来调用,比如emp1.ename="Harry"



JavaScript 面向对象(oop)

oop即面向对象的语言,有三大特点:

1.封装
——把相关的信息(无论数据或方法)存储在对象中
2.继承
——从其他对象获得属性和方法
3.多态
——能以多种不同的形式运行函数或方法


原型与继承

1.原型:

在JavaScript中,函数本身也是一个包含了方法和属性的对象,每个函数都有prototype属性,该属性引用的就是原型对象。
原型对象是保存共享属性值和共享方法的对象,同时JavaScript并没有规定一个函数的原型类型,因此原型可以是任何类型

2.内存图描述:




3.删除属性

可以使用delete关键字删除,如: delete emp1.ename;  delete emp1.prototype.age;

4.自有属性与原型属性

1).自有属性:通过对象的引用添加的属性,其他对象即使有此属性,也是相互独立的;
2).原型属性:从原型对象中继承来的属性,一旦原型对象中属性值改变,所有继承自该原型的对象属性均改变
3).自有属性覆盖(重写)原型属性。
4).检测:
①使用hasOwnProperty()检测对象是否具备指定自有属性;
②使用in检测对象及其原型链中是否具备指定属性。

5.对象的prototype属性

1).自定义对象的prototype属性:
-new创建的对象,使用其构造函数的prototype作为原型
-对象直接量的原型为:Object.prototype
2).内置对象的prototype属性,如:Array对象,Boolean对象,Date对象,String对象,Number对象。

6.获取原型

获取原型,进而可实现共享属性的两种方法:
1).使用构造函数的prototype属性
2).使用专门的getPrototypeOf()方法


7.原型链

在JavaScript中,原型对象本身也有原型,构造函数的原型对象中也有一个_proto_属性,默认指向Object类型的原型对象
Object.prototype是所有对象的原型,其中包括了所有对象共有的属性和方法,如tostring();
事实上,所有对象通过_proto_属性的引用关系,都可以直接或间接的引用到Object.prototype对象;
我们将使用对象的_proto_属性,形成逐级引用的关系,称为原型链。
 - 内存图描述



继承


1.继承的实现方式:

通过原型实现继承有以下两种方式:
1).修改构造函数的原型,为该构造函数创建的对象指定统一的父级对象。语法:构造函数.prototype=父级对象;
注意:1.修改原型后,用此构造函数创建的新对象,均引用新原型。
2.修改原型之前,用此构造函数创建的对象,将无法使用新原型,依然使用旧原型,因此被孤立。

2).单独修改一个对象的原型,而不影响其他对象的原型,语法:Object.setPrototypeOf(子对象,父对象);

2.检查对象的原型


isPrototypeOf()用于判断一个prototype对象是否存在于另一个对象的原型链中,如果是返回true,否则false。


3.只继承于原型


  ——出现效率的考虑,应尽可能的把可重用的属性和方法添加到原型中去
1).不要单独为继承关系创建新对象;
2).尽量减少运行时的方法搜索,如tostring()

4.继承与扩展


JavaScript中的继承基于prototype,而不是基于类。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端小魏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值