最近在学习设计模式,找了很多资料也没有看懂,看到怀疑智商,怀疑人生,思来想去还是把锅甩到基础不够扎实上。虽然原型继承、闭包、构造函数也都有学习过,但理解得不够透彻,影响到后续提高。这次重新开始学习,一边记录总结,希望有所收获,如果能对一起学习的小伙伴有帮助就更好了。

第一篇先从构造函数谈起。构造函数顾名思义,是用来构造的,构造什么呢?构造对象。在 javascript 中,对象是拥有属性和方法的数据。举个简单的例子,如果把一个人看作一个对象,那么年龄、性别等就是它的属性,吃饭、睡觉等是它的方法。我们来创建一个 jack 对象:

var jack = {
name: 'Jack',
jump: function() {
console.log('Jack-jump')
}
}

如果我们想再创建一个 rose 对象,还需要把上面的代码再写一遍,而二人仅仅是名字不同。这时候我们会想到用一个函数来创建对象,对象名字可通过传参获取。

function createPerson(name) {
var person = {}
person.name = name
person.jump = function() {
console.log(name + '-jump')
}
return person
}

测试结果

var jack = createPerson('Jack')
jack.jump() // Jack-jump
var rose = createPerson('Rose')
rose.jump() // Rose-jump

这个函数可以满足我们的需求,但不够简洁,下面我们来看一下怎么利用构造函数来创建对象

function Person(name) {
this.name = name
this.jump = function() {
console.log(this.name + '-jump')
}
}

是不是简洁了很多?当我们需要创建具体人物时,使用 new 关键词来创建对象,创建出来的对象也叫做实例。

var jack = new Person('Jack')
jack.jump() // Jack-jump
var rose = new Person('Rose')
rose.jump() // Rose-jump

这里需要解释一下 this 和 new 的意义。细心的人会发现在写构造函数时函数名首字母用了大写,显得和普通函数不一样,有些神秘,其实构造函数和普通函数本质上并没有什么不同,用大写仅仅是为了同普通函数区分,表示这是一个要用来创建对象的函数。重点在关键词 new 上,简单来说,new 一个实例有以下步骤:

1. 创建一个新对象

2. 将构造函数作用域赋给新对象(即 this 指向新对象)

3. 执行函数里的代码

4. 返回函数

我们发现1、3、4就是 createPerson 函数所做的事,至于2涉及到作用域比较复杂,后面有时间再研究总结,现在只要知道 this 指向了 new 出来的新对象,因此我们给 this 增加的属性和方法都会绑定到新对象上去。

至此我们知道了如何利用构造函数(其实本质上是用 new 关键词)创建对象,它比一般函数直接创建要简洁很多。

javascript 面向对象学习(一)——构造函数的更多相关文章

  1. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承   这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...

  2. Javascript面向对象——创建对象、构造函数的原型

    Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...

  3. JavaScript面向对象学习笔记

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

  4. javascript面向对象学习(一)

    面向对向的初体验 创建一个标签 // 传统 var p = document.createElement('p'); var txt = document.createTextNode('我是传统js ...

  5. javascript 面向对象学习(三)——this,bind、apply 和 call

    this 是 js 里绕不开的话题,也是非常容易混淆的概念,今天试着把它理一理. this 在非严格模式下,总是指向一个对象,在严格模式下可以是任意值,本文仅考虑非严格模式.记住它总是指向一个对象对于 ...

  6. javascript 面向对象学习(二)——原型与继承

    什么是原型? 首先我们创建一个简单的空对象,再把它打印出来 var example = {} console.log(example) 结果如下: { __proto__: { constructor ...

  7. javascript面向对象(三):非构造函数的继承

    本文来自阮一峰 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承" ...

  8. javascript面向对象(二):构造函数的继承

    本文来自阮一峰 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有 ...

  9. Javascript面向对象编程:构造函数的继承

    今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...

随机推荐

  1. JS的函数和对象四

    复习 数组 toString/join/concat/slice/splice/reverse/sort/ push/pop/unshift/shift 字符串 new String(2)  /  S ...

  2. 3.6 Go String型

    1. Go String型 Unicode是一种字符集,code point UTF8是unicode的存储实现,转换为字节序列的规则 go的rune类型 可以取出字符串里的unicode 字符串是一 ...

  3. iOS不移除通知也不会崩溃原因

    在iOS9.0之前,通知中心对观察者对象进行unsafe_unretained 引用,当被引用的对象释放时不会自动置为nil,,也就是成了野指针. iOS9.0之后通知中心对观察者做了弱引用. 参考: ...

  4. poj2823单调队列认知

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 62930   Accepted: 17963 ...

  5. 洛谷P2754 [CTSC1999]家园

    题目链接:https://www.luogu.org/problemnew/show/P2754 知识点: 最大流 解题思路: 先用 \(DFS\) 判断是否无解. 从时刻 \(0\) 开始枚举答案, ...

  6. CF916C

    题目链接:http://codeforces.com/contest/916/problem/C 题目大意: 用\(n\)个结点,\(m\)条边(每条边的权值范围为[1, 109]) 构造出一个无向带 ...

  7. HDU6035 Colorful Tree

    题目链接:https://vjudge.net/problem/HDU-6035 题目大意: 多样例输入. 对于每一个样例,给出 n \((2 \le n \le 200000)\) 个结点的一棵树, ...

  8. 【python爬虫】scrapy入门7:Scrapy中runspider和crawl的区别

    runspider:不依赖创建项目 命令:scrapy runspider myspider.py  等同于  pyhton myspider.py crawl:使用spider进行爬取,依赖项目创建 ...

  9. Android Studio代码编译通过但是提示停止运行

    这种问题也许有很多可能,但是我遇到过一种,下面分享给大家希望问题会得到解决 检查你的布局文件中图片的位置 如果图片名前有“(v24)”的删掉 重新插入图片到这个目录 然后就可以正常运行了

  10. jsonp跨域封装

    一.什么是同源政策? 同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI.主机名和端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来 ...