从“原型”看—计算机科学的解决问题驱动性

在计算机科学发展的历程中可以看到无论是工具还是模式的进步革新都不是无的放矢的,一个概念的提出绝不仅仅是定义一个名词那么简单,其必然是为了满足某种需求或者解决某类问题。现在无比繁荣的计算机科学也是在一次次的遇见问题,发现问题,解决问题,遇到新的问题的循环中发展起来的。

而这种认知对我们学习这门技术科学也是有好处的,在历史上一些问题已经得到了解决,而些聚集了无数智慧的解决方式也成为了经典。可能那些之前困扰着世界上最聪明的那部分人的问题在现在已经不是问题,甚至都不会引起你我的察觉。现在我们虽不必在纠结该去如何解决,而是仍可以从这些经典的案列,从那些为解决问题而生的工具,包,模式,架构出发,去思考其中的所蕴含的创造性思考方式,严谨自洽的逻辑链。这可能比代码,比工具本身更重要。
下面就通过”原型“这个概念,来看一下解决问题是怎么驱动模式进步的。

问题1:用Object构造函数和对象字面量构造多个对象时效率太低,会造成代码重复。

解决方法:工厂模式
用函数来封装以特定的接口创建对象的细节
function createPerson(name,age,job){
1.声明对象
2.利用参数完善对象的细节(声明对象的对象名属性名=形参)
3.返回对象
}

问题2:工厂模式还是没有代替类的功能,没法解决对象识别的问题
解决方式:参考原生构造函数Object(),Array(),可以自定义构造函数,从而自定义对象类型的属性和方法。
function Person(参数1,参数2,参数3){

( 函数名首字母大写)
这是一个单纯的函数
不用声明对象,不用返回对像
利用参数是用this代替对象名。

}
使用时按照构造函数的使用方法,利用new关键字构造函数构造函数与工厂函数的区别在于,工厂函数本身就具有定义对象的功能,而在使用构造函数时完成对象定义的是new关键字。构造函数只是定义对象类型的方法和属性所以如果没有关键字 var person1=Person(参数1,参数2,参数3)是无法完成定义对象的任务的。反而因为这个函数没有返回值,person1的值只能是undefined。

问题3:在应用构造函数,每定义一个对象,都会定义该对象的方法,每一次定义方法都会生成
一个新的的函数,也就是会创建很多个功能相同且只能对同类对象进行操作的函数,这是很浪费资源的。
解决方法:可以在构造函数外部创建一个有相应功能的函数,然后作为属性值在创建构造函数时赋于某个属性,生成方法。这样可以就某一个功能值创建一个函数,供某“类”对象调用。

问题4:在全局中定义很多函数,只供特定“类”对象使用,会造成命名污染。同时也不利于该类型“类”对象的封装性。

解决方法:在函数中都有一个prototype属性,这个属性是一个指针,对应着一个原型对象。把一个”类“公用的属性和方法发在这个对象中,被该函数作为构造函数所创建的对象中,都会有一个属性prototype,这个属性也是个指针,与函数中prototype属性所对应的对象一致。这个对象即是该某一”类“对象的原型对象。

例:

functionfun(){

   fun.prototype.name=“我在原型对象中”,

   fun.prototype.sayName=function(){

                        alert(this.name)

                     }

}

为了方便理解我们可以把这个例子中的对象称为obj原型,把用fun作为构造函数创建的对象称为fun实例。在这个例子中函数fun可以用fun.prototype把公用的属性和方法保存在obj原型里,而所有的fun实例都可以通过fun实例.proto来访问obj原型,访问其中的属性和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值