面向对象编程
幺四四零
这个作者很懒,什么都没留下…
展开
-
26.使用IIFE创建模块
参考什么是立即执行函数,它有什么作用?说明立即执行函数表达式(IIFE)通常用于将相关功能分组到单个对象或module中。例如,一个之前的挑战定义了两个组合:function glideMixin(obj) {obj.glide = function() {console.log("在水面上滑翔");};}function flyMixin(obj)...原创 2020-04-01 21:22:48 · 401 阅读 · 0 评论 -
25.立即执行函数表达式(IIFE)
说明JavaScript中的常见模式是在声明时立即执行一个函数:(function () { console.log("Chirp, chirp!"); })();// 这是一个匿名的函数表达式,它立即执行// Outputs "Chirp, chirp!" immediately需要注意,该函数没有名称,并且不存储在变量中。函数表达式结尾处的两个括号()可以立即执行或调用...原创 2020-04-01 17:29:50 · 189 阅读 · 0 评论 -
24.使用 closure 闭包来保护对象内部的属性不被外部修改
说明在之前的挑战中,bird具有公共属性name。它被认为是公共的,因为它可以在bird的定义之外被访问和更改。bird.name ="Duffy";因此,你的代码的任何部分都可以轻松地将bird的名称更改为任何值。联想到像密码和银行帐户可以轻松的被你代码库的任何部分更改,这可能会导致很多问题。使属性为私有的最简单的方法是在构造函数中创建一个变量。这会将该变量的范围更改为构造函...原创 2020-03-31 20:17:31 · 419 阅读 · 0 评论 -
23.使用Mixin给不相关的对象之间添加常见行为
说明正如你所看到的,行为是通过继承共享的。但是,有些情况下继承不是最好的解决方案。继承不适用于不相关的对象,如Bird和Airplane。他们都可以飞行,但是Bird不是一种Airplane,反之亦然。对于不相关的对象,最好使用mixins。mixin允许其他对象使用一组函数。var flyMixin = function(obj) {obj.fly = function() ...原创 2020-03-31 19:11:21 · 140 阅读 · 0 评论 -
22.覆盖继承的方法
说明在之前的课程中,你了解到一个对象可以通过克隆其prototype对象来继承其他对象的行为(方法):ChildObject.prototype = Object.create(ParentObject.prototype);然后,ChildObject通过将它们链接到其prototype来接收自己的方法:ChildObject.prototype.methodName = ...原创 2020-03-31 18:28:29 · 176 阅读 · 0 评论 -
21.继承后添加方法
说明从supertype构造函数继承其prototype对象的构造函数除了继承方法之外,还可以拥有自己的方法。例如,Bird是一个从Animal继承其prototype的构造函数:function Animal() { }Animal.prototype.eat = function() {console.log("nom nom nom");};function Bir...原创 2020-03-31 15:22:33 · 346 阅读 · 1 评论 -
20.重置一个已继承的constructor属性
说明当一个对象从另一个对象继承其prototype时,它也继承了supertype的constructor属性。以下是一个例子:function Bird() { }Bird.prototype = Object.create(Animal.prototype);var duck = new Bird();duck.constructor // function Animal(...原创 2020-03-30 22:40:24 · 208 阅读 · 0 评论 -
19.将子原型设置为父级的实例
说明在之前的挑战中,你看到从supertype(或父类)Animal继承行为的第一步:创建一个新的Animal实例。这个挑战将涉及下一步:将subtype(或子类)的prototype—在这个例子中是Bird—设置为Animal的实例。Bird.prototype = Object.create(Animal.prototype);要记住,prototype类似于创建对象的“配...原创 2020-03-29 16:08:43 · 141 阅读 · 0 评论 -
18.从supertype继承行为
说明在之前的挑战中,你创建了一个名为Animal的supertype,它定义了所有动物共享的行为:function Animal() { }Animal.prototype.eat = function() {console.log("nom nom nom");};这个和下一个挑战将介绍如何在Bird和Dog中重复使用Animal方法,而不是再定义它们。它使用一种称为i...原创 2020-03-27 21:56:38 · 167 阅读 · 0 评论 -
17.使用继承,Do not Repeat Yourself
说明在编程中有一个原则,称为:Do not Repeat Yourself(DRY)。重复代码问题的原因是因为任何更改都需要在多个地方修复代码。这通常意味着更多的程序员的工作量和更多的错误的空间。请注意在下面的示例中,describe方法由Bird和Dog共享:Bird.prototype = {constructor: Bird,describe: function()...原创 2020-03-26 18:00:55 · 595 阅读 · 0 评论 -
16.了解原型链
说明JavaScript中的所有对象(除了一些例外)都有一个prototype。而且,一个对象的prototype本身就是一个对象。function Bird(name) {this.name = name;}typeof Bird.prototype; // => object因为prototype是一个对象,所以一个prototype可以有自己的prototyp...原创 2020-03-26 17:40:29 · 103 阅读 · 0 评论 -
15.了解对象的prototype来自哪里
说明就像人们从父母那继承基因一样,一个对象直接从创建它的构造函数继承其prototype。例如,这里的Bird构造函数创建了duck对象:function Bird(name) {this.name = name;}var duck = new Bird("Donald");duck自Bird构造函数继承其prototype。你可以使用isPrototypeOf方法显示此...原创 2020-03-25 21:13:04 · 140 阅读 · 0 评论 -
14.在更改prototype时设置constructor属性
说明手动将prototype设置为新对象有一个关键的副作用:它删除了constructor属性!那么之前挑战中的代码将会为duck打印以下内容:console.log(duck.constructor)// 打印为'undefined'要解决这个问题,只要在将prototype手动设置为新对象时,记得定义constructor属性:Bird.prototype = {...原创 2020-03-25 19:51:38 · 255 阅读 · 0 评论 -
13.将prototype更改为新对象
说明到目前为止,你已经分别向prototype添加了多个属性:Bird.prototype.numLegs = 2;在添加多个属性之后,这将变得乏味。Bird.prototype.eat = function() {console.log("nom nom nom");}Bird.prototype.describe = function() {console...原创 2020-03-24 13:56:38 · 165 阅读 · 0 评论 -
12.了解constructor属性
说明在之前的挑战中创建的对象实例duck和beagle上有一个特殊的 constructor 属性:var duck = new Bird();var beagle = new Dog();console.log(duck.constructor === Bird);//prints trueconsole.log(beagle.constructor === Dog);//pri...原创 2020-03-24 13:37:39 · 211 阅读 · 0 评论 -
11.迭代所有属性
说明你现在已经了解到了两种属性:own属性和prototype属性。own属性直接在对象实例上定义。而prototype属性是在prototype上定义。function Bird(name) {this.name = name;//own property}Bird.prototype.numLegs = 2; // prototype propertyvar duck =...原创 2020-03-23 21:16:47 · 187 阅读 · 0 评论 -
10.使用prototype属性来减少重复的代码
说明由于numLegs对于Bird的所有实例可能具有相同的值,因此在每个Bird实例中基本上都有一个重复的变量numLegs。在只有两个实例时,这可能不是问题。但想象如果有数百万个实例,那将是很多重复的变量。一个更好的方法是使用Bird的prototype。prototype 是在Bird的所有实例之间共享的对象。以下是将numLegs添加到Bird的prototype的方法:B...原创 2020-03-22 20:32:31 · 144 阅读 · 0 评论 -
09.了解own属性
说明在下面的示例中,Bird 构造函数定义了两个属性:name 和 numLegs。function Bird(name) { this.name = name; this.numLegs = 2;}var duck = new Bird("Donald");var canary = new Bird("Tweety"); name 和 numLegs 被称为 ...原创 2020-03-21 13:58:48 · 205 阅读 · 0 评论 -
08.使用instanceof验证对象的构造函数
说明任何时候,一个构造函数创建一个新的对象,该对象会被认为是它的构造函数的一个 instance。JavaScript 提供了一种方便的方法来验证它:instanceof 运算符。instanceof 允许你将对象与构造函数进行比较,根据该对象是否使用构造函数创建,返回 true 或 false。以下是一个例子:var Bird = function( name, co...原创 2020-03-20 11:07:02 · 179 阅读 · 0 评论 -
07.扩展构造函数以接收参数
说明来自之前挑战里的 Bird 和 Dog 构造函数运行良好。但是,请注意,使用 Bird 构造函数创建的所有 Birds 都自动命名为Albert,颜色为蓝色,并有两条腿。但如果你想要不同的名称和颜色的鸟呢?可以手动更改每只鸟的属性,但这将是有很多步骤:var swan = new Bird();swan.name = "Carlos"; swan.color = "wh...原创 2020-03-20 10:48:39 · 333 阅读 · 0 评论 -
06.使用构造函数创建对象
说明以下是来自上一个挑战的 Bird 的构造函数:function Bird() { this.name = "Albert"; this.color = "blue"; this.numLegs = 2; //"this"在构造函数内总是引用正在创建的对象}let blueBird = new Bird();请注意,调用构造函数时使用 new 运算符...原创 2020-03-19 21:39:50 · 299 阅读 · 0 评论 -
05.定义构造函数
说明constructor 构造函数是创建新对象的函数。它们定义新对象的属性和行为。将它们视为创建新对象的蓝图。以下是 constructor 构造函数的示例:function Bird() { this.name = "Albert"; this.color = "blue"; this.numLegs = 2;}这个 constructor 定义了具有 ...原创 2020-03-19 21:21:29 · 203 阅读 · 0 评论 -
04.使用 this 关键词使代码更可复用
说明上一个挑战介绍了向 duck 对象引入一个 method 。它使用 duck.name 的点符号来访问 return 语句中的 name 属性的值:sayName: function() { return "这个鸭子的名字是" + duck.name +"."; }虽然这是访问对象属性的有效方法,但这里存在一个缺陷。如果变量名称更改,则引用原始名称的所有代码都需要更新。在一...原创 2020-03-19 14:56:59 · 150 阅读 · 0 评论 -
03.在对象上创建一个方法
说明:object 可以有一种特殊类型的 property ,称为方法 method 。method 作为 property 时是函数。这会向 object 添加不同的行为。以下是使用方法的 duck 示例:var duck = { name: "Aflac", numLegs: 2, sayName: function() { return "这只鸭子的名字是...原创 2020-03-18 22:23:27 · 136 阅读 · 0 评论 -
02.使用点符号来访问对象的属性
说明:上一个挑战是使用各种 property 创建一个 object ,现在你将看到如何访问这些 property 的值。以下是一个例子:var duck = { name: "Aflac", numLegs: 2 }; console.log(duck.name); // 这将打印“Aflac”到控制台在 object 名称 duck 中使用点符号,后面是 property 的名称 ...原创 2020-03-18 11:07:33 · 397 阅读 · 1 评论 -
01.创建一个JavaScript基本对象
解析:想想人们每天看到的东西,如汽车、商店和鸟类。这些都是对象 object :人们可以观察和交互的有形的东西。这些 object 的一些特质是什么?一辆车有车轮,商店卖物品,鸟有翅膀。这些素质或属性 property 定义了组成 object 的内容。请注意,类似的 object 共享相同的 property ,但这些 property 可能有不同的值。例如,所有的汽车都有车轮,但并不是所...原创 2020-03-17 21:30:39 · 130 阅读 · 1 评论