关于对象

以下代码中 p 的值是一个新对象,里面拥有 nameage 属性

function People(name, age){
this.name = name
this.age = age
}
var p = new People('evenyao', 27)

下面代码得到的结果同理,因为 return 的是一个 “非对象”

function People(name, age){
this.name = name
this.age = age
return 'hello'
}
var p = new People('evenyao', 27)

如果是下面代码, p 的值为一个新对象,里面拥有 ab 属性

function People(name, age){
this.name = name
this.age = age
return {a: 1, b: 2}
}
var p = new People('evenyao', 27)

new

function Person(name) {
this.name = name
this.sayName = function() {
console.log('say name...')
}
}
var p = new Person('evenyao')

以上代码的执行过程如下:

  1. 执行 new Person
  • 创建一个空对象 {},假设名字是 tmpObj
  • 执行 Person 函数,执行过程中对 this 操作就是对 tmpObj 进行操作
  • 函数执行完后返回刚刚创建的 tmpObj
  1. 把 tmpObj 赋值给 p (p也指向同一个对象)

instanceof

instanceof 是一个操作符,可以判断对象是否为某个类型的实例

构造函数

function Person(nick,age){
this.nick= nick
this.age = age
this.printName = function(){
console.log('say name...')
}
} var p1 = new Person('Byron',20)
var p2 = new Person('Casper',25)
//p1.printName()
//p2.printName()
 
 

图示可以看出,实例可以通过 __prop__ 访问到其类型的 prototype 属性,这就意味着类的 prototype 对象可以作为一个公共容器,供所有实例访问。

抽象重复

//按照原型链的写法   使用公共容器
function Person(nick,age){
this.nick= nick
this.age = age
}
Person.prototype.sayName = function(){
console.log('say name...')
} var p1 = new Person('Byron',20)
var p2 = new Person('Casper',25)
// p1.sayName() `Byron`
// p2.sayName() `Casper`
 

这时候对应的关系是这样的

 

原型链

JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做 __proto__ 的内置属性,用于指向创建它的函数对象的原型对象 prototype 。在访问一个对象属性的时候,如果对象本身没有找到这个属性,就会沿着原型链一层一层的寻找。

总结原型

这三句话能解释一切关于原型方面的问题

  • new 一个函数的时候会创建一个对象,『函数.prototype』 等于 『被创建对象.__proto__

     
     
  • 一切函数都是由 Function 这个函数创建的,所以『Function.prototype === 被创建的函数.__proto__

     
     
  • 一切函数的原型对象都是由 Object 这个函数创建的,所以『Object.prototype === 一切函数.prototype.__proto__

     
     

举例

案例1

扩展 String 的功能增加 reverse 方法,实现字符串倒序

var str = 'hello evenyao'
var str2 = str.reverse()
console.log(str2) // 'oayneve olleh'

即在Stringprototype上添加 关于reversefunction,然后再调用 reverse()

String.prototype.reverse = function(){
return this.split("").reverse().join("")
console.log(this)
}
var str = 'hello evenyao'
var str2 = str.reverse()
console.log(str2) // 'oayneve olleh'

案例2

代码中并未添加 toString 方法,这个方法是哪里来的?

function People(){
}
var p = new People()
p.toString()

p.toString() 方法是继承构造函数 Object 的原型对象里定义的 toString 方法,首先 p 会找自己的 toString 方法;如果没有找到,就会沿着__proto__ 属性继续到构造函数 Peopleprototype 里找 toString 方法;如果还是没有找到,再继续往 People.prototype__proto__Object.prototypetoString 方法,最后找到 toString 方法。

 

理解 JavaScript 原型 / 原型链的更多相关文章

  1. 三张图较为好理解JavaScript的原型对象与原型链

    最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...

  2. 理解 JavaScript 对象原型、原型链如何工作、如何向 prototype 属性添加新的方法。

    JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型, ...

  3. 理解JavaScript的原型链

    1. 什么是对象 在JavaScript中,对象是属性的无序集合,每个属性存放一个原始值.对象或函数. 1.1 创建对象 在JavaScript中创建对象的两种方法: ① 字面上: var myObj ...

  4. 理解JavaScript 的原型属性

    1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaS ...

  5. 深入理解javascript之原型

    理解原型 原型是一个对象.其它对象能够通过它实现属性继承. 不论什么一个对象都能够成为继承,全部对象在默认的情况下都有一个原型.由于原型本身也是对象,所以每一个原型自身又有一个原型. 不论什么一个对象 ...

  6. 如何理解JavaScript的原型和原型链

    在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说 ...

  7. [我的理解]Javascript的原型与原型链

    一.原型与原型链的定义 原型:为其他对象提供共享属性的对象 注:当构造器创建一个对象,为了解决对象的属性引用,该对象会隐式引用构造器的"prototype"属性.程序通过const ...

  8. 理解Javascript的原型和原型链

    前言 本文2088字,阅读大约需要13分钟. 总括: 结合实例阐述了原型和原型链的概念并总结了几种创建对象的方法,扩展原型链的方法. 参考文章:The Secret Life of Objects,继 ...

  9. 简单理解javascript的原型prototype

    原型和闭包是Js语言的难点,此文主要讲原型. 每一个方法都有一个属性是 prototype 每一个对象都有一个属性是 _proto_ 一旦定义了原型属性或原型方法,则所有通过该构造函数实例化出来的所有 ...

  10. 【深入理解javascript】原型

    1.一切都是对象 一切(引用类型)都是对象,对象是属性的集合 typeof函数输出的一共有几种类型,在此列出: function show(x) { console.log(typeof(x)); / ...

随机推荐

  1. 一致性模型(consistency model)

    比如下面的例子: 一行X值在节点M和节点N上有副本 客户端A在节点M上写入行X的值 一段时间后,客户端B在节点N上读取行X的值 一致性模型所要做的就是决定客户端B能否看到客户端A写的值.一致性模型分为 ...

  2. 启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat

    如果发现,是启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat ,你可以去看看你的环境变量,是不是配了一个tomcat,

  3. Oracle session相关数据字典(一)

    (一)session相关视图 (1)视图 v$session v$active_session_history dba_hist_active_session_history 如果是多节点数据库,v$ ...

  4. Linux - CentOS 7 yum方式快速安装MongoDB

    一.安装环境及配置yum # more /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # vi /etc/yum.repos.d/m ...

  5. pl/sql developer开发工具的beautifier美化插件

    对于存储过程中需要编写大量的sql语句,这必然需要美化语句,使得程序可读性更高. pl/sql developer开发工具自带美化工具,不过美化的时候容易使得语句全部改变成大写格式,这样就需要一个插件 ...

  6. 为什么我们需要DTO?

    最近在写代码时突然产生了这个疑惑,我们为什么需要DTO进行数据传输呢? 要了解DTO首先我们要知道什么是DAO,DAO就是数据库的一个数据模型,是一个类文件里面存储着数据库的字段及其getter&am ...

  7. 奇(qi)谋(ji)巧(yin)计(qiao)

    一.打表法 0.http://oeis.org/ 1.差分序列:https://blog.csdn.net/wu_tongtong/article/details/79115921 对于一个多项式产生 ...

  8. Redis服务端和客户端的命令

    服务器端 服务器端的命令为redis-server 可以使⽤help查看帮助⽂档 redis-server --help 个人习惯 ps aux | grep redis 查看redis服务器进程su ...

  9. mysql使用数据库

    哈哈 只能怪自己太菜哈 刚接触这个MySQL没多久 今天用终端登陆MySQL的时候mysql -u root -p 然后就想看看自己的数据库 我用的MySQL的客户端是navicat for mysq ...

  10. Centos6_32位系统512M内存_如何安装gogs_Mysql_配置开机自启动

    因为有很多人的Linux版本比较低,内存配置也较低,X86 ,32位系统的:所以这里推荐采用二进制安装gogs,并且使用Mysql:这个是傻瓜式的安装方案,适合绝大多数人(提及了centos7的安装思 ...