自定义类型的创建

创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。

 1 window.onload = function() {
 2     var person1 = new Person("Nicholas", 29, "Software Engineer");
 3     var person2 = new Person("Greg", 27, "Doctor");
 4 
 5     person1.friends.push("Van");
 6 
 7     document.writeln("person1.friends : " + person1.friends + "<br />");    // Shelby,Court,Van
 8     document.writeln("person2.friends : " + person2.friends + "<br />");    // Shelby,Court
 9     document.writeln("person1.friends === person2.friends : " + (person1.friends === person2.friends) + "<br />");    // false
10     document.writeln("person1.sayName === person2.sayName : " + (person1.sayName === person2.sayName) + "<br />");    // true
11 };
12 
13 /**
14  * 构造函数模式用于定义实例属性
15  * @param {string} name 姓名
16  * @param {number} age  年龄
17  * @param {string} job  工作
18  */
19 function Person(name, age, job){
20     this.name = name;
21     this.age = age;
22     this.job = job;
23     this.friends = ["Shelby", "Court"];
24 
25     // 动态原型模式,该代码只有在初次调用构造函数的时候才会执行
26     if (typeof this.sayName !== "function") {
27         Person.prototype.sayName = function() {
28             alert(this.name);
29         }
30     }
31 }

 以上方法,对于有其他OO语言经验的开发人员去看,比较容易理解,但是性能上并不推荐。因为每次创建新的实例都需要进行一次判断,哪怕这次的性能损耗是极小的,但毕竟也是有损耗。

我还是将定义方法和共享属性放在外面,通过原型模型去创建自定义方法,如果有更加优质的代码,欢迎分享!

 1 window.onload = function() {
 2     var person1 = new Person("Nicholas", 29, "Software Engineer");
 3     var person2 = new Person("Greg", 27, "Doctor");
 4 
 5     person1.friends.push("Van");
 6 
 7     document.writeln("person1.friends : " + person1.friends + "<br />");    // Shelby,Court,Van
 8     document.writeln("person2.friends : " + person2.friends + "<br />");    // Shelby,Court
 9     document.writeln("person1.friends === person2.friends : " + (person1.friends === person2.friends) + "<br />");    // false
10     document.writeln("person1.sayName === person2.sayName : " + (person1.sayName === person2.sayName) + "<br />");    // true
11 };
12 
13 /**
14  * 构造函数模式用于定义实例属性
15  * @param {string} name 姓名
16  * @param {number} age  年龄
17  * @param {string} job  工作
18  */
19 function Person(name, age, job){
20     this.name = name;
21     this.age = age;
22     this.job = job;
23     this.friends = ["Shelby", "Court"];
24 
25     // 动态原型模式,该代码只有在初次调用构造函数的时候才会执行
26     // if (typeof this.sayName !== "function") {
27     //     Person.prototype.sayName = function() {
28     //         alert(this.name);
29     //     }
30     // }
31 }
32 
33 Person.prototype.sayName = function() {
34     alert(this.name);
35 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Redis源码学习系列

Redis源码学习之字典

在字典结构体中,包含了一组字典函数(dictType),通过封装的方法处理对应的操作,通常在字典初始化的时候对其进行配置。

35610
来自专栏积累沉淀

CXF 发布 Web Service

使用CXF框架开发 ①.CXF : xfire–>xfire + celtrix 做web service开发的开源框架 ②.开发Server端: 加入...

25060
来自专栏Porschev[钟慰]的专栏

开发中巧用Enum枚举类型

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个St...

21470
来自专栏余林丰

MyBatis源码解读(4)——SqlSession(上)

  在上一篇博客中提到MyBatis是如何实现代理类MapperProxy,并抛出了一个问题——是怎么执行一个具体的sql语句的,在文末中提到了MapperMe...

24760
来自专栏牛肉圆粉不加葱

[Spark源码剖析] JobWaiter

来创建容纳job结果的数据,数组的每个元素对应与之下标相等的partition的计算结果;并将结果处理函数(index, res) => results(ind...

7620
来自专栏企鹅号快讯

如何在 Bash 中抽取子字符串

所谓“子字符串”就是出现在其它字符串内的字符串。 比如 “3382” 就是 “this is a 3382 test” 的子字符串。 我们有多种方法可以从中把数...

20190
来自专栏ios 技术积累

ios 自动释放池

OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机,即当我们创建了一个对象,并把他加入到了自动释放池中时,他...

23020
来自专栏Java面试通关手册

Java多线程学习(三)volatile关键字

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_G...

20430
来自专栏Petrichor的专栏

python: set函数

27420
来自专栏企鹅号快讯

Windows路径转换为Msys2表示的Linux路径

实现功能: H:\MySpace\PluginConfig 转换为: /h/MySpace/PluginConfig ? 实现代码 #!/usr/bin/gaw...

22860

扫码关注云+社区

领取腾讯云代金券