笔记:ECMA 工厂模型、构造模型、原型模型 (一)

/**************面向对象模型 创建对象*********************/
/*工厂模式*/

function CreateObj (name,sex,sayName){
var obj = new Object();
obj.name = name;
obj.sex = sex;
obj.sayName = function(){
	alert(this.name);
}
return obj;
}
var person = CreateObj("工厂模型createName",20,"It‘s Name");
person.sayName();

  

/* 构造函数对象模式*/

function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
   alert(this.name);
}
}

var per0 = new Person("构造函数模型xuan",24);
//per0.sayName();

/*使用Call 方法创建对象 */
var o = new Object();
Person.call(o,"callName",18);
//alert(o.name);

  

/****************小结*************
创建一个对象
1、直接调用工厂模型的创建对象函数
2、调用构造函数
3、使用Call方法
**********************************/

/**********原型模型的提出***********/

function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
//alert(this.name);
alert("This Name");
this.sayName2 = sayName2;
}
}

function sayName2(){
alert("全局方法");
}

var per0 = new Person("构造函数模型xuan",24);
var per1 = new Person("构造函数模型xuan",25);
//per0.sayName();

alert(per0.sayName == per1.sayName);  // 内部方法  false
alert(per0.sayName2 == per1.sayName2);//调用全局  true

  

/*其中,per0和per1调用sayName方法时候,两者并不是同一个函数

 

因为每创建一次实例pro的时候,每new一次,其实就是在创建一个方法,故两者并不相同。

也同事可以看出,在执行效率方面,肯定是打折扣了的。

故、试着使用全局方法,使得在定义函数方面,只定义一次。Function sayName2

但,这样就会造成,如果封装很多功能的话,就会全局增加很多不必要的方法。

*/

 

/*上述构造函数模型中的方法,,在JS中,如果是大项目,并且要使用公共的方法的话,就必须使用全局方法,,因为方法只是针对此类对象而言,所以,全局会造成不必要的代码冗余和执行效率问题。。*/

/*提出原型模型,给原型模型的对象指定一些方法,可以达到所有实例共享方法的功能*/

/*原型模型

每创建一个函数 都有一个prototype属性 这个属性是一个指针,
这个指针指向一个对象,这个对象的用途,就是将特定的公共的方法,都放到这个
对象中,那么 就起到一个所有实例共享的作用
*/

function proFunc(){}

var obj = proFunc.prototype;  // 原型对象  objobj.name =""

alert(obj.constructor);       //构造函数  alert为proFunc函数var obj1 = proFunc.prototype;alert();
// 构造函数的prototype就是指向 原型对象// 原型对象的constructor就是构造函数本身// 实例对象的prototype 指向 原型对象

function proFunc(){}
var obj = proFunc.prototype;
alert(obj.constructor);
obj.name="hello"
obj.sayName = function(){
alert("原型模型");
}
var obj2 = proFunc.prototype;
alert(obj2.name);//hello
obj2.sayName();
/*
这样,就不需要每次创建对象时候,创建属性和方法

并且所有实例对象,均可访问
*/

我们创建的每一个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
原型对象实际就是一个构造函数的实例对象,与普通的实例对象没有什么本质上的区别,js中每一个对象都有一个原型对象。不过他比较特殊,该对象所包含的所有属性和方法能够供构造函数的所有实例共享,这就是其他语言所说的继承,而javascript通过原型对象来实现继承,简称原型继承。静态原型继承:Object.prototype.[method field] ;
isPrototypeOf(实例对象) 判断原型的方法
ECMA5: Object.getPrototypeOf():根据实例对象获得原型对象
object.hasOwnProperty(attribute) 判断属性是否属于对象本身
in 操作符 判断对象中是否存在该属性(无论是实例对象还是原型对象)
ECMA5新特性 Object.keys();拿到当前对象里的所有keys 返回一个数组
ECMA5新特性 Object.getOwnPropertyNames 枚举对象所有的属性 :不管该内部属性能否被枚举

原型对象,实力对象,构造函数

构造函数的prototype就是指向 原型对象原型对象的constructor就是构造函数本身实例对象的prototype 指向 原型对象

  

时间: 2024-08-13 14:37:06

笔记:ECMA 工厂模型、构造模型、原型模型 (一)的相关文章

软件工程之快速原型模型

引入快速原型模型的原因: 如果用传统的方法开发一个系统,在初期需求方面的工作时,无论和用户做如何详细的沟通,用户都能难对自己的需求表达准确.全面,因为用户和开发团队双方的知识领域有很大差异. 开发人员懂技术,业务人员了解业务和客户层面,导致沟通需求方面时存在很多问题,理解不一致. 从而导致已经完成大半的软件产品极可能被返工,加大了软件产品开发的时间和成本.而时间和成本是软件开发中最重要的,所以需要引入可以克服这些缺点的快速原型模型. 快速原型模型: 结构: 结构优点:在结构上看,快速原型模型是不

JS面向对象——组合使用构造函数模型与原型模型

该模型为创建自定义类型最常用的方式. <!DOCTYPE html> <html> <head> <title>组合使用构造函数模型和原型模型</title> <script type="text/javascript"> //组合使用构造函数模型和原型模型——构造函数模型用于定义实例属性,原型模型用于定义方法和共享属性. function Student(name,age,sex){ this.name=name

快速原型模型

快速原型模型(Rapid Prototype Model) 快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求.通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么:第二步则在第一步的基础上开发客户满意的软件产品. 显然,快速原型方法可以克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险,具有显著的效果. 快速原型的关键在于尽可能快速地建造出软件原型,一旦确定了客户的真正需求,所建造的原型将被丢

C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型

模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不立即产生代码.只有在用到模板时,如果调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调用函数时[不是模板],编译器只需看到函数的声明.类似的,定义类类型的对象时,类定义必须可用,但成员函数的定义不是必须存在的.因此,应该将类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中. 模板则不同:要进行实例化,编译器必须能够访问定义模板的源代码.当调用函数模板或类模板的成员函

Away3D 学习笔记(一): 加载3DS格式的模型文件

加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 1 private function load3DSFile():Loader3D 2 { 3 loader = new Loader3D(); 4 loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE,onLoadComplete); 5 loader.addEventListener(AssetEvent.ASSET_COMPLETE,onAsset

软件开发过程-------瀑布模型、原型模型、螺旋模型、敏捷开发模型

瀑布模型: 计划 → 需求分析 →  设计 →  编码 →  测试 →  运行维护 特点:①软件开发的各项活动严格按照线性方式进行.       ②当前活动接受上一项活动的工作结果.           ③当前活动的工作结果需要进行验证. 缺点:①由于开发模型是线性的,增加了开发的风险.           ②早期的错误可能要等到开发后期的阶段才能发现. 原型模型: 客户与开发公司紧密联系,开发周期长.开发会受到需求变更的影响. 特征:①实现客户与系统的交互. ② 进一步细化待开发软件需求. ③

软件开发生命周期模型 瀑布模型、增量模型、原型模型、螺旋模型、喷泉模型总结

在校期间学习过这些模型,现在来复习一下. 瀑布模型/改进的瀑布模型 虽然瀑布模型仍然存在很多的问题有待解决,但瀑布模型仍然是最基本的和最效的一种可供选择的软件开发生命周期模型.瀑布模型要求软件开发严格按照需求 ->分析->设计->编码->测试的阶段进行,每一个阶段都可以定义明确的产出物和验证准则.瀑布模型在每一个阶段完成后都可以 组织相关的评审和验证,只有在评审通过后才能够进入到下一个阶段. 由于需要对每一个阶段进行验证,瀑布模型要求每一个阶段都有明确的文档产出,对于严格的瀑布模型

PyTorch 模型构造

记录几种模型构造的方法: 继承Module类来构造模型 Module是所有神经网络模块的基类,通过继承它来得到我们需要的模型,通常我们需要重载Module类的__init__函数和forward函数. 实例 import torch.nn as nn import torch.nn.functional as F class Model(nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = nn.Co

ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为,一条评论 id 对应一篇文章,为 ONE_TO_ONE 关系 ( 一对一 ).评论表的结构为: 其中 aid 字段与文章表的 id 字段对应.打开自定义模型 ArticleModel,让模型继承于 RelationModel,然后定义成员属性 $_link,代码: ArticleModel.cla