js面向对象的程序设计

1、属性类型:分为数据属性和访问器属性,都可以通过Object.defineProperty()方法来设置,传入的第一个参数是要修改的对象,第二个参数是对象的属性,第三个参数是一个对象,包括要设置的属性及属性值。定义多个属性用Object.defineProperties()。可以通过Object.getOwnPropertyDescription()方法来读取,第一个参数为要访问的对象,第二个参数是要访问的对象的属性,返回值是一个对象,用.value或者.configurable来获取属性。(configurable、enumerable、writable、value\configurable、enumerable、set、get)

2、js的设计模式:

一、工厂模式:

function createObjFactory(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    return o;
}
var person1 = createObjFactory('mike','28','teacher');

工厂模式虽然解决了创建多个相似的问题,可以省去很多重复性的代码。

但是也有缺点:没有解决对象识别问题(即怎样知道这个对象从哪来的)

二、构造函数模式:

function Person(name,age,job){ //大写
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    };
}
var person1 = new Person('john','23','doctor');
var person2 = new Person('wq','25','worm');
Person('hehe','12','dentist');//当做普通函数调用,当在全局作用域中调用一个函数时,this对象总指向Window对象
var o = new Object();
Person.call(o,'haha','22','actor');//此处不能写成o.Person('hehe','22','ee');因为o中不存在Person方法

这种创建对象的方式,可以通过调用person1.constructor来取得person1的构造函数(不过constructor是一个属性,可以随时改变),也可以用instanceof来检测:person1 instanceof Person //true   person1 instanceof Object  //true(person1是Person的实例也是Object的实例)。

但是也有缺点:Person中的sayName方法每次都要新建不同的Function实例;虽然可以把sayName定义为全局方法,可是如果一个构造函数要用到很多方法,那会在全局定义很多全局函数,丝毫没有封装性。


三、原型模式:

每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,包含了此函数的所有实例可以共享的属性和方法。所以:

function Person(){
}
Person.prototype.name = 'John';
Person.prototype.age = '9';
Person.prototype.sayName = function(){
    alert('this.name');
}
var person1 = new Person();
person1.sayName();         //John
var person2 = new Person();
person2.sayName();         //John
alert(person1.sayName == person2.sayName)     //true

这个模式也有缺点:给所有的实例都初始化了相同的属性值;虽然对共享函数是比较合适的,但是对于包含引用类型值的属性来说,问题就很突出了:比如prototype中有一个属性friends,它的value是一个数组,数组是一用类型,当在一个实例对象中改变friends属性的时候,另外一个实例中引用的值也跟着变化。

四、组合使用构造函数模式和原型模式:(使用最广泛的)

把需要共用的方法放到prototype中,把方法之外的其他值用构造函数的this中。

五、动态原型模式:

在构造函数中添加公共方法的时候,做个判断:

if(typeof this.sayName != function){
    Person.prototype.sayName = function(){
        alert(this.name);
    }
}
这样可以保证只有第一次调用构造函数的时候才会执行

六、寄生构造函数模式:

有一种情况:创建一个具有额外方法的特殊数组,犹豫不能直接修改Array的构造函数,可以使用这种模式。

function SpecialArray(){
    var values = new Array();
    values.push.apply(values,arguments);
    values.toString = function(){
        return this.join('|');
    };
    return values;
}
var colors = new SpecialArray('red','blue');
alert(colors.toString()); //'red|blue|green'

但是,返回的对象与构造函数与构造函数原型属性之间没有关系。

七、稳妥构造函数模式:

安全环境中,禁止使用this和new

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

function Person(name,age){
    var o = new Object();
    //这里可以定义私有变量和函数,外部访问不到
    o.sayName = function(){
       alert(name);
    };
    return o;
}

//调用的时候也不用new 
var friend = Person('Nancy','11');
friend.sayName();








内容概要:本文介绍了基于Python实现的SSA-GRU(麻雀搜索算法优化门控循环单元)时间序列预测项目。项目旨在通过结合SSA的全局搜索能力和GRU的时序信息处理能力,提升时间序列预测的精度和效率。文中详细描述了项目的背景、目标、挑战及解决方案,涵盖了从数据预处理到模型训练、优化及评估的全流程。SSA用于优化GRU的超参数,如隐藏层单元数、学习率等,以解决传统方法难以捕捉复杂非线性关系的问题。项目还提供了具体的代码示例,包括GRU模型的定义、训练和验证过程,以及SSA的种群初始化、迭代更新策略和适应度评估函数。; 适合人群:具备一定编程基础,特别是对时间序列预测和深度学习有一定了解的研究人员和技术开发者。; 使用场景及目标:①提高时间序列预测的精度和效率,适用于金融市场分析、气象预报、工业设备故障诊断等领域;②解决传统方法难以捕捉复杂非线性关系的问题;③通过自动化参数优化,减少人工干预,提升模型开发效率;④增强模型在不同数据集和未知环境中的泛化能力。; 阅读建议:由于项目涉及深度学习和智能优化算法的结合,建议读者在阅读过程中结合代码示例进行实践,理解SSA和GRU的工作原理及其在时间序列预测中的具体应用。同时,关注数据预处理、模型训练和优化的每个步骤,以确保对整个流程有全面的理解。
内容概要:本文详细介绍了如何使用PyQt5创建一个功能全面的桌面备忘录应用程序,涵盖从环境准备、数据库设计、界面设计到主程序结构及高级功能实现的全过程。首先,介绍了所需安装的Python库,包括PyQt5、sqlite3等。接着,详细描述了SQLite数据库的设计,创建任务表和类别表,并插入默认类别。然后,使用Qt Designer设计UI界面,包括主窗口、任务列表、工具栏、过滤器和日历控件等。主程序结构部分,展示了如何初始化UI、加载数据库数据、显示任务列表以及连接信号与槽。任务管理功能方面,实现了添加、编辑、删除、标记完成等操作。高级功能包括类别管理、数据导入导出、优先级视觉标识、到期日提醒、状态管理和智能筛选等。最后,提供了应用启动与主函数的代码,并展望了扩展方向,如多用户支持、云同步、提醒通知等。 适合人群:零基础或初学者,对Python和桌面应用程序开发感兴趣的开发者。 使用场景及目标:①学习PyQt5的基本使用方法,包括界面设计、信号与槽机制;②掌握SQLite数据库的基本操作,如创建表、插入数据、查询等;③实现一个完整的桌面应用程序,具备增删改查和数据持久化功能;④了解如何为应用程序添加高级特性,如类别管理、数据导入导出、到期日提醒等。 阅读建议:此资源不仅适用于零基础的学习者,也适合有一定编程经验的开发者深入理解PyQt5的应用开发。建议读者跟随教程逐步实践,结合实际操作来理解和掌握每个步骤,同时可以尝试实现扩展功能,进一步提升自己的开发技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值