• 自定义类型的创建


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

     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 }
  • 相关阅读:
    设置屏幕分辨率的函数 回复 "董勇" 的问题
    Delphi 的内存操作函数(5): 复制内存
    汉字与区位码(1) 转换函数
    汉字与多字节编码的转换 回复 "不知道" 的问题
    一个可以显示多边形的 TMyShape 类 回复 "董勇" 的问题
    Delphi 的内存操作函数(6): 跨进程的内存分配
    Delphi 中的 IfThen 函数 回复 "深挖洞、广积粮" 的问题
    Byte 数组转字符串 回复 "不知道" 问题
    汉字与区位码(2) 分析
    获取各种编码的识别符
  • 原文地址:https://www.cnblogs.com/tinyTea/p/9922868.html
Copyright © 2020-2023  润新知