《JS高程(3)》-第6章笔记(03)

本文介绍了JavaScript面向对象编程的多种模式,包括构造函数模式、原型模式、动态原型模式、寄生构造函数模式及稳妥构造函数模式等。每种模式都有详细的解释和示例代码,帮助读者理解如何在实际开发中应用这些模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第六章 面向对象的编程

6.2 创建对象
  1. 基础模式(见笔记02

    • 工厂模式

    • 构造函数模式

    • 原型模式

  2. 升级模式

    • 组合使用构造函数和原型模式

    • 动态原型模式

    • 寄生构造函数模式

    • 稳妥构造函数模式


2.1 组合使用构造函数和原型模式

定义引用类型的默认模式

function Person (name, age, job){
    this.name = name;
    this.age = age; 
    this.job = job;
    this.friends = ["Shelby", "Count"];
} 

Person.prototype = {
    constructor : Person,//声明constructor指向
    sayName : function(){
        alert (this.name);
    }
}

var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

person1.friends.push("Van");

alert(person1.friends); //Shelby,Count,Van
alert(person2.friends); //Shelby,Count
alert(person1.friends === person2.friends); // false
alert(person1.sayName === person2.sayName); // true

构造函数模式用于定义实例属性;

原型模式用于定义方法和共享的属性。

优点:每个实例都会有实例属性的副本,又共享着方法,并支持向构造函数传递参数;最大限度节省了内存。


2.2 动态原型模式
function Person (name , age , job ){
    // 属性
    this.name = name ;
    this.age = age;
    this.job = job;

    //方法
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            alert (this.name);
        };//仅执行一次,第二次调用时构造函数的原型已初始化。
    }
}

var friend = new Person ("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"
  1. if 语句,只有在初次调用构造函数时才会执行仅且执行一次;

  2. if语句检查的是初始化后应该存在的任何属性和方法, 条件不成立时,所执行的代码中,可以添加多个方法;

  3. 有混合模式的优点,并把所有信息都封装在了构造函数中;

  4. 初始化原型 后所做的修改,能在所有实例中得到反馈。


2.3 寄生构造函数模式
创建一个函数,用来封装构创建对象的代码,并返回新创建的对象。

为实例创造构造函数:

function Person (name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age; 
    o.job = job;
    o.sayName = function(){
        alert(this.name)    
    };
    return o;
} 

var person1 = new Person("Nicholas", 29, "Software Engineer");

person1.sayName (); //"Nicholas"

与工厂函数的区别:

  • 内部所封装的函数称为构造函数;
  • 适用new操作符创建实例对象。

为对象创建构造函数;

function SpecialArray (){
    //创建数组
    var values = new Array();

    //添加值
    values.push.apply(values, arguments);

    // 添加方法
    values.toPipedString = function(){
        return this.join("|");
    };

    //返回数组
    return values;
}

var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString());         // "red|blue|green"
alert(colors instanceof SpecialArray); //false
alert(colors instanceof Object);       //true
  • 因Array构造函数无法直接修改,则通过封装构造函数,将数组以函数值的形式返回;
  • 返回的对象与构造函数和构造函数的原型没有任何关系;
  • Object .push.apply()。

2.4 稳妥构造函数模式

稳妥对象,指的是没有公共属性,且其方法也不使用this的对象

function Person (name, age, job){

    //创建要返回的对象
    var o = new Object();

    //可以在这里定有私有变量和函数
    o.sayName = function(){
        alert(name) 
    };

    //返回对象
    return o;
} 

var person1 = new Person("Nicholas", 29, "Software Engineer");

person1.sayName (); //"Nicholas"
  • 除了调用sayName()方法外,没有其他方式访问其数据成员。

  • 稳妥构造函数模式创建的对象与构造函数之间没有关系。

看了一篇博文,关于稳定构造函数讲得比较详细:JS之稳妥构造函数模式and静态私有变量。(这样链接不违规吧)

把对象的创建重新又梳理了一边,花费了一天多的时间,相比第一次的头晕眼花,每次重看都有一些新的认识,在相同的字面上,总能找到之前未曾发现的东西(也说明我心太大…看书没沉下心)。

要培养一种良好思维方式,看书时要抱着目的去寻找解决方式,这样理解应该比较深刻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值