了解JavaScript 面向对象基础 & 原型与对象
面向对象语言中的对象
老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来说不太一样, 但是理解总是好的.
首先, 先有类型(Class), 这个类是指具有本质相同的一类事物, 比如大自然中的, 动物类, 植物类, 岩石类, 他们在根本上面具有本质相同的特性, 类下面也区分小的类, 比如同是动物类, 动物类里面也可以有猫类, 狗类, 当然啦, 人类也是一种类, 而在编程中, 类就是这一类东西用代码体现的一种抽象.
然后, 就有了对象(Object), 对象就是类中的一个个体, 比如人类中的一个人, 这就是对象, 再举些例子, 比如猫类中一只猫, 狗类里面具体到个体的一只狗, 都可以理解为对象, 在编程中, 对象就是类抽象出来的一个个体的实例.
可能上面说的有点晦涩, 但是久了就好理解了, 现在举点更具体的例子, 老师这一个职业, 算是一类人, 也就是类, 而你最喜欢的那个老师就是这个类的对象, 说白了就是类有种包含关系, 人类里面可以有男人类, 女人类, 也可以有教师类, 消防员类, 在日后的学习中, 大家也会知道, 这些小的类都可以称之为人类的子类, 也可以说这些类继承了人类, 而对象却不具备这种特性, 它只是某个类抽象到个体之后的单个实例(也就是实际的例子), 比如一位老师, 一个消防员, 这都是对象.
JS中的对象
JS中对对象的描述也差不太多, 只是JS是一种基于对象的语言, 并不是完全意义上的面向对象, 想要实现JS的类, 应该是一种使用函数模拟的方式, 所以可以这么说, JS中有模拟的类, 不存在真实意义上的类. 不过我们这里不纠结类, 着重讲对象.
上面说的让大家对对象也有一定理解了, 那么下面给大家再加一个新的概念, 那就是属性, 属性是一个对象的一些特点, 比如拿人作为一个对象, 那么人就有名字, 年龄, 身高, 体重这些特点, 这些特点也就是这个人作为一个对象的属性. 所以现在我们知道了, 一个对象它是具有很多属性的.
那么概念性的东西差不多了, 现在我们开始着重用代码讲对象.
首先我们先创建出一个对象.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
var peron大家都知道, 变量的声明, 指向了一个对象, 对象的类型如上所示, {}中间用" : "分隔的属性和属性值, 通常我个人习惯称之为键值对(key-value), 这里面创建了一个对象, 这个对象共有三个属性, name, age, gender, 属性名, 也就是key, 这个key的类型没有特殊的限制(可以是值, 可以是字符串, 甚至于可以是另一个对象), 但是会通过toString()方法自动转化为字符串, 所以可以理解为key最后都会是一个字符串, 而value的类型没有特殊的限定(可以是值, 可以是字符串, 对象等等). 要注意的是, 属性是无序的, 所以声明的时候不需要注意顺序之类的.
对象创建方法
第一种, 使用{}包含键值对的方式创建对象(对象直接量).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
profession : {
compang : "Oricle",
job : "iOS"
}
};
第二种, 使用new构造器关键字.
var person = new Object();
第三种, 使用Object.create()方法创建对象.
var person = Object.create({
name : "Jianwei",
age : 23,
gender : "male"
});
前两个方式比较好理解, 最后的这种方式, 简单介绍下, Object.create这个方法需要一个对象类型的参数, 创造出的对象的原型指向的就是这个参数, 这个参数是字面量对象, 原型指向的自然是Object.prototype了, 具体使用哪个, 要因地制宜.
对象属性的访问
对象的属性一般通过两种方式访问, 最常见的是通过点方法来进行访问, 也可以通过key索引的方式, 如上的代码案例.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
如果我想要为oerson的name属性重新赋值, 那么使用如下语句的实现效果是相同的.
person.name = "Jianwei Wang";
person["name"] = "Jianwei Wang";
对象的原型(prototype)
这里我还是用不严谨的个人理解来给大家讲, 这样有助于大家理解, 当大家能够理解我的看法, 再去查看严谨的理论, 我相信这样的学习是更好令人消化的.
之前我们有讲父类和子类, 就比如人类, 和教师类, 人类是教师类的父类(super class), 教师类是人类的子类, 所以人类具有的所有属性, 教师类都继承了下来, 比如姓名, 年纪, 教师类也可以有自己新的, 父类所没有的属性, 比如教过了多少学生, 带过多少班级. 所以现在大家先给自己一个这样的思想, 就是父类的不作特殊修饰的属性, 子类都可以继承.
现在我们再来看JS中的对象, 首先, 有两种创建对象的方式, 上面说过了, 继承也简单的解释了, 那么很恶心的知识下面是, 建议大家用一天的时间来理解.
每个JS对象(null除外, 其实它本来自己有一个类型的, 但是官方那边修改之后发现, 大量的浏览器都出错了, 所以当使用typeof的时候, null显示的类型还是Object类型), 都和另一个对象相关联, "另一个"对象就是原型.
通过直接量创建的对象都继承自Object.prototype(这句代码其实是对原型对象的引用).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
那么这个person对象继承的就是Object.prototype, 如果这时候为其添加了一个属性, 语句如下:
Object.prototype.hobby = "eat";
那么这个时候, 也能够从person上面访问到hobby这个属性, 也可以对hobby进行修改(能否修改会取决于一些条件, 我这段代码是允许, 后面会讲具体的设置方法).
通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值.
function person(){
name : "Jianwei",
age : 23,
gender : "male"
};
var jianweiWang = new person();
那么这个jianweiWang对象继承的就是person.prototype, 如果这时候为其添加了一个属性, 语句如下:
person.prototype.hobby = "eat";
那么这个时候, 也能够从jianweiWang上面访问到hobby这个属性, 也可以对hobby进行修改(能否修改会取决于一些条件, 我这段代码是允许, 后面会讲具体的设置方法).
这个继承关系也可以称之为原型链, jianweiWang继承的是person.prototype, 再往上继承的是Object.prototype, 所以如果Object.prototype上的属性, 几乎所有的对象都会有.
所以假如为一个对象的一个属性赋值, 首先会顺着原型链向上找, 如果整个原型链都没有, 才会为这个对象添加一个属性.
所有的继承来的属性并不是实际拥有了, 只是通过原型链获取到了, 复制给了自己一份, 所以假如上面的例子.
jianweiWang.hobby = "run";
但是这个时候打印person.prototype.hobby, 结果还是"eat", 因为只是副本变了, 本身并不会变.
了解JavaScript 面向对象基础 & 原型与对象的更多相关文章
- 第一百零九节,JavaScript面向对象与原型
JavaScript面向对象与原型 学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标 ...
- 03.JavaScript 面向对象精要--理解对象
JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次 ...
- JavaScript 面向对象之原型对象
原型的概述 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype 通过调用构 ...
- JavaScript面向对象基础与this指向问题
前 言 我们的程序语言经历了从"面向机器".到"面向过程".再到"面向对象"的一个过程.而JavaScript是一 ...
- JavaScript中的原型和对象机制
1.对象相关的一些语言特性 JavaScript里所有的东西都是对象, 对象是属性的集合.要知道,函数也是对象, 能够作为变量的值. 返回值. 参数或者属性的值. 函数对象特殊的地方是能通过" ...
- JavaScript 面向对象与原型
ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和 ...
- 对JavaScript 引擎基础:原型优化的研究 -----------------------引用
一.优化层级与执行效率的取舍 介绍了现代 JavaScript 引擎通用的工作流程: 我们也指出,尽管从高级抽象层面来看,引擎之间的处理流程都很相似,但他们在优化流程上通常都存在差异.为什么呢?为什么 ...
- javascript面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现. 工厂 ...
- JavaScript面向对象和原型函数
对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...
随机推荐
- 在Linux和Windows平台上操作MemoryMappedFile(简称MMF)
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段..NET 4.0新增加了一个System.IO. MemoryMap ...
- 入园记------我的DBA之路
今天周一拖着疲惫的身躯 11点才离开公司,回到家估计写完这篇博客就要17号了. 一个人走在回家的路上,很黑,突然很多感触,一个人在北京拼搏,不敢停止学习的脚步,因为只要停下来就会感觉到孤独. 回顾一下 ...
- CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- PHP 调用webService方式
方法如下: <?php header('Content-Type: text/html; charset=UTF-8'); define('APP_ROOT', dirname(__FILE__ ...
- 4.修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)
1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...
- ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
在使用SSH终端(如Xshell)登陆时,若不慎点击 Ctrl + S 按键,会导致终端很像被锁定,输入和输出都无响应. 这是由于操作系统的终端收到指令 Ctrl + S 后,会暂停终端输入输出的刷 ...
- 关于android中调用系统拍照,返回图片是旋转90度
转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...