构造函数

javascript面向对象

与世无争的帅哥 提交于 2020-02-09 15:11:09
# javascript面向对象(一) 对象其实就是一种引用类型。而对象的值就是引用类型的实例。在JavaScript 中引用类型是一种数据结构,将数据和功能组织在一起。它也常被称做为类,但JavaScript 中却没有类的概念。虽然JavaScript 是一门面向对象的语言,却不具备传统面向对象语言所支持的类和接口等基本结构。 ## 对象的创建以及常用操作 ## 1. **使用new运算符** var user = new Object(); //使用new运算符创建一个对象 user.name = 'tina; //给对象添加属性 user.age = 22; user.address = '四川成都'; 2. **对象字面量(JSON方式)** var user = { name:'编程浪子', age:22, address:'四川成都' }; 3. **简单方式(传统赋值方式)** var user = {}; user.name = 'tina'; //给对象添加属性 user.age = 22; user.address = '四川成都'; 4. **属性的调用** 对于对象属性的调用有两种方式: 调用方法如下: alert(user.name + " " +user.age);//返回 '编程浪子 四川成都' 另一种方法: alert(user['name'] +

javascript 之 prototype继承机制

江枫思渺然 提交于 2020-02-09 15:09:55
理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。 1、引言 1994年,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。工程师Brendan Eich 负责开发这种新语言。他觉得,没必要设计得很复杂,这种语言只要能够完成一些简单操作就够了,比如判断用户有没有填写表单。这年,正是面向对象编程(object-oriented programming)最兴盛的时期。 Brendan Eich无疑受到了影响,Javascript里面所有的数据类型都是对象(object),这一点与Java非常相似。 但是,他随即就遇到了一个难题,到底要不要设计"继承"机制呢? 如果真的是一种简易的脚本语言,其实不需要有"继承"机制。但是,Javascript里面都是对象,必须有一种机制,将所有对象联系起来。所以,Brendan Eich最后还是设计了"继承"。 但是,他不打算引入"类"(class)的概念,因为一旦有了"类",Javascript就是一种完整的面向对象编程语言,这好像有点太正式,而且增加了初学者的入门难度。 他考虑到,如Java面向对象语言使用new生成实例(当然6年后出现的C#,亦是如此)。 Foo

Prototype原型模式

巧了我就是萌 提交于 2020-02-09 14:52:55
通过构造函数的弊端引出原型概念 先看一个一只猫的构造函数 function Cat(name,color){ this.name = name; this.color = color; this.type = "猫科动物"; this.eat = function(){alert("吃老鼠");}; } var cat1 = new Cat("大毛","黄色"); var cat2 = new Cat ("二毛","黑色"); alert(cat1.type); // 猫科动物 cat1.eat(); // 吃老鼠 表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。 再看 alert(cat1.eat == cat2.eat); //false 因此,为了让type属性和eat()方法在内存中 只生成一次 ,然后所有实例都指向那个内存地址,引出了原型 什么是原型? 原型对象实际上就是构造函数的一个实例,和普通的实力对象没有本质上的区别。可以包含特定类型的所有实例的共享属性或者方法。这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。

JavaScript原型模式(prototype)

末鹿安然 提交于 2020-02-09 14:51:49
1.原型是一个对象,其他对象可以通过它实现属性的继承所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,所以一个类的真正原型是被类的内部[prototype]属性所指出。每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。 如上图,SuperType是是一个函数,右侧的方框就是它的原型。 注:上图来自 http://www.cnblogs.com/wangfupeng1988/p/3978131.html2.什么可以称之为对象?在JavaScript中一个对象:就是任何的无序的键值对的集合function var a={}如果他不是一个主数据类型(undefined null boolean number string)其他的通通叫做对象。 JavaScript中的原型(prototype)是和函数(function紧密相连的)var o={} 他不是有用function他有原型吗? 答:必须的每一个通过new操作符生成出来的对象都持有一个属性__proto__,这个属性保存了创建他的构造函数的prototype的原型的引用。 类的扩展方式有两类共三种: 说明一下,是在原型链上层扩展出来的。两类:分为是否是function定义的类分为两种

Java基础之二、类的基础

旧街凉风 提交于 2020-02-09 14:05:06
类定义---方法及其处理的数据对象的集合结构 将现实的对象(物体)和概念映射到程序中的对象(变量)中 1:使用 new 运算符创建的类类型的主体称为 实例 ,创建实例的操作称为 实例化,   new Account()实例化了一个Account实例; 2:对象就是对程序运行时 动态创建 的主体的总称 3:类 实例 中的字段,即 实例变量 ,会初始化为默认值 4:类结构  原则上所有的字段都应该设为私有,未指定private的字段默认访问都是对包内部公开的  将字段设为私有,防止外部访问,使方法和字段紧密结合称之为 封装 5:构造函数的作用就是正确的 初始化实例,防止初始化不完整或者不正确  声明类类型的时候一定要提供构造函数,如果类中未定义,会默认定义一个空的构造函数  构造函数不是方法,不能通过实例.构造函数()访问 6:方法和消息  实例方法的调用可表示为向对象“ 发消息 ” 7:标识符命名  类:大驼峰(首字母大写);接口:大驼峰(首字母大写),表示动作的接口名称时形容词。表示(“可……的”)接口以”……able“结尾,例如Cloneable,Runnable;  方法:小驼峰(首字母小写);字段:小驼峰(首字母小写);常量:全部大写,多个单词之间用_分隔;局部变量或形参:小驼峰(首字母小写) 8:方法访问器  用于获取字段值的方法称为 getter 方法

JS创建对象的几种方式

人盡茶涼 提交于 2020-02-09 12:12:08
1.Object构造函数模式 var obj = new Object(); obj.name = 'Tom'; obj.age = 11; obj.setName = function(name){   this.name = name; } 适用场景:创建对象起始时候不确定对象内部的数据 问题:语句太多 2.对象字面量模式 var p = {   name:'Tom',   age:'11',   setName:function(){     this.name = name;   } } var p1 = {   name:'Jack',   age:'15',   setName:function(){     this.name = name;   } } 适用场景:创建对象时就知道内部需要哪些属性,同类型对象只创建一个 问题:创建同类型的多个对象时候,要重复定义这些相同的属性和方法 3.工厂模式(很少用) function createPerson(name,age){   var obj = {     name:name,     age:age,     setName:function(name){       this.name = name;     }   }   return obj; } 使用场景:同类型对象需要创建多个 问题

Nunit单元测试基础知识

隐身守侯 提交于 2020-02-09 08:39:36
推行单元测试的目的: 1、 减少BUG提高项目的质量 2、 养成良好的编码习惯,提高开发人员编码水平 要测什么What? 最小的可测试软件元素(单元) , 包括单元的内部结构(如逻辑和数据流)以及单元的功能和可观测的行为 . 由于开发方式的不同,单元测试一般划分方法如下: 1. 面向对象的软件开发:以 Class( 类 ) 作为测试的最小单元。以方法的内部结构作为测试的重点。 2. 结构化的软件开发:以模块(函数、过程)作为测试的最小单元。 如何测试 How? 白盒测试方法:测试单元的内部结构, Nunit Nmock 黑盒测试方法:测试单元的功能和可观测的行为 《通用测试用例》 步骤: 一、 如何设计单元测试 需要弄清楚被测试代码实现的功能和相应的逻辑关系; If…else… Switch..case… While... 同时还要考虑到测试的输入内容,以及返回的结果; 用例的设计要保证面面俱到,是否覆盖了每一条路径。 而如何做到面面俱到这就需要恶我们对每个函数进行详细的分析,将分析和讨论的结果归入相关的测试库中。初期工作的进度慢并不要紧,只要能做得很详细对于以后的测试还是有很大的帮助。或许以后的测试中,只要直接调用原来写过的测试类库,修改部分简单的语句就可以实现新模块的单元测试了 [TestFixture] 表示:类包含了测试代码(这个特性可以被继承)。这个类必须是 公有 的

JavaScript 创建对象的七种方式

巧了我就是萌 提交于 2020-02-09 03:57:33
JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产。接下来介绍七种非常经典的创建对象的方式,他们也各有优缺点。 工厂模式 function createPerson ( name , job ) { var o = new Object () o . name = name o . job = job o . sayName = function () { console . log ( this . name ) } return o } var person1 = createPerson ( 'Jiang' , 'student' ) var person2 = createPerson ( 'X' , 'Doctor' ) 可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象 工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型 构造函数模式 function Person ( name , job ) { this . name = name this . job = job this . sayName = function () { console . log ( this . name ) } } var

ES6中的class 与prototype

[亡魂溺海] 提交于 2020-02-08 23:32:06
一、定义构造函数 在以前的js中,生成一个对象实例,需要先定义构造函数,然后通过prototype 的方式来添加方法,在生成实例: function Person(){ this.name = "测试"; this.age = 26; } Person.prototype.getName = function(){ console.log("name:" + this.name) } var p = new Person() 然而系现在的ES6 class Person{ constructor(name, age){ this.name = name; this.age = age; } getName() { return this.name; } } var p = new Person("luoqiang",26) 在ES5中原本的构造函数被constructor 替代,本来需要定义在prototype上面的,方法直接定义在class里面即可。 ES6中的类的数据类型就是函数,类本身指向构造函数,使用的时候也需要new命令。 类中所有的方法都定义在类的prototype属性上面。 class B {} let b = new B(); b.constructor === B.prototype.constructor // true 二、Class 的静态方法 ES6

对象的几种创建方法

半世苍凉 提交于 2020-02-08 23:02:28
创建对象的5中方式 直接字面量 虽然Object构造函数或对象字面量,或者Object.create()都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。 工厂模式 这种将创建对象的封装成为函数,调用函数来创建对象。用函数来封装以特定接口创建对象的细节. function createPerson(age,name){ var o = {}; o.age = age; o.name = name; o.sayName = function(){ console.log(this.name); } return o; // 不能确定对象的类型。 } var p = createPerson('zhangsan',25); p.sayName(); // zhangsan 在上面我们创建的是Person类型的对象p,但是却不能判断他的类型是Person。 工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题。 构造函数模式 创建自定义的构造函数,从而定义自定义对象类型的属性和方法。这样就可以将实例对象指定为特定对象了。注意,该模式直接去用this定义属性和方法,并没有显示的创建对象,且没有返回值。 改写前面的例子: function Person(age,name){ this.name = name; this.age