面向对象回顾

/*
面向对象的程序设计
面向对象(Object-Oriented,OO)语言有一个标志,那就是它们度要类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。
1理解对象
创建自定对象最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法
*/
//对象字面量的方法
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
}
var person = {
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
}
数据属性
要修改默认属性的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。其中描述符对象的属性必须是configurable,enumerable,writable,value。设置其中一或多个值,可以修改对应的特性值
configurable: 表示能否通过delete删除属性从新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
var person = {};
Object,defineProperty(person,"name",{
writable: false,
value: "Nicholas"
})
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
访问器属性
访问器属性不包含数据值;他们包含一对儿getter和setter函数,在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数传入新值,这个函数负责决定如何处理数据。
访问器属性不能直接定义,必须使用Object。defineProperty()来定义。
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue -2004;
}
}
});
book.year = 2005;

创建对象
虽然Object构造函数或字面量可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象会产生大量的重复代码。未解决这个问题,人们开始使用工厂模式的一种变体。
工厂模式
用函数来封装特定接口创建对象的细节
function createPerson(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 = createPreson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");
构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}
}
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Nicholas",29,"Greg",27,"Doctor");
创建Person的新实例,必须使用new操作符
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
(3)执行构造函数中的代码(为这个心对象添加属性)
(4)返回新对象
原型模式
我们创建的每个函数度有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
function Person(){

}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "software enginner";
Person.peototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
理解原型对象
只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
在默认的情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包括一个指向prototype属性所在函数的指针。
Person.prototype.constructor指向Person。而通过这个构造函数,我们可以为原型对象添加其他属性和方法

hasOwnProperty()方法可以检测一个属性是否存在于实例中,还是存在原型中。
取得对象上所有可枚举的实例属性 Object.keys()方法,这个方法接受一个对象作为参数,返回包含所有可枚举属性的字符串数组:
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "software enginner";
Person.peototype.sayName = function(){
alert(this.name);
};
var keys = Object.keys(Person.prototype);
console.log(keys) ; //"nam,age,job,sayName"

组合使用构造函数模式和原型模式
创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。
1构造函数模式用于定义实例属性
2原型模式用于定义方法和共享属性
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends = ["Shelby","count"];
}
Person.prototype={
constructor:Person,
sayName: function(){
console.log(this.name);
}
}
var person1 = new Person("Nicholas",29,"software engineer");
var person2 = new Person("Greg",19,"doctor");
Person1.friends.push("Van");
实例属性都是在构造函数中定义,而所有实例共享的属性constructor和方法都市在原型中定义
构造函数定义实例属性,原型模式定义方法和共享属性这种混合模式,比较广泛

继承 ECMAScript只支持实现继承,而且主要依靠原型链继承
每个构造函数度有一个原型对象,原型对象度包含一个指向构造函数的指针,实例包含一个指向原型对象的内部指针。假如一个原型有事另一个类型的实例这样层层递进构成实例和原型的链条。
function SuperType(){
this.prototype=true;
}
SuperType.prototype.getsuperValue = function(){
return this.prototype;
}
function SubType(){
this.subproperty = false;
}
//继承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue =function(){
return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue());

组合继承
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
}
function SubType(name,age){
//继承属性
SuperType.call(this,name);
this.age = age;
}
//继承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
}
var instance1 = new SubType("Nick",29);
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //Nick
instance1.sayAge()//29

原文地址:https://www.cnblogs.com/zhihou/p/9708555.html

时间: 2024-10-10 13:24:49

面向对象回顾的相关文章

面向对象回顾01

面向对象初识 1.函数式编程 对 面向过程编程的两个特点 减少代码的重复性 增强代码的可读性 2.面向对象编程 对 面向过程编程 2.1 什么是面向对象 ? 面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来. 2.2 什么是类,什么是对象 ? 类:就是具有相同属性和功能的一类事物. ? 对象:就是类的具体表现. 3.类的结构 class Human: """ 此类主要是构建人类 &quo

mysql篇---ORM框架

一.面向对象回顾 二.ORM框架 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 安装: pip3 install SQLAlchemy SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: MySQL-Pyth

前端学习html css js

html 第一章 :HTML模板 HTML是什么(超文本标记语言) HTML网页主体结构 doctype标签 head标签 meat标签 title标签 body标签 第二章:HTML标题 h1标题标签 h2标题标签 h3标题标签 h4标题标签 h5标题标签 h6标题标签 hr水平线标签 第三章:HTML 段落 p段落标签 br换行标签 第四章:HTML 样式 center定义居中内容 font和basefont定义HTML字体 s和strike定义删除线文本 u定义下划线文本 第五章:HTML

第一章 深入.NET框架

一. .NET的过人之处 1..NET框架提高了软件的可重复行 ,可扩展性,可维护行和灵活性. 2.对web应用的强大支撑. 3.对Web Service(Web服务)的支持. 4.实现SOA,支持云计算. 5.支持构建.NET程序外衣. 二..NET框架体系结构 .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编辑环境..NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务, 使得Internet上的各应用程序之间,可以使用Web服务进行沟通.从层次结构来看

django restfulwork 源码剖析

概要: 1.restful 规范(建议); 2. django rest framework框架 内容回顾: 1.开发模式; - 普通开发模式(前后端放在一起写) - 前后端分离 好处: 后端一套,前端使用app,pc等: 2. 后端开发 为前端提供URL(API的开发) 注:永远返回Httpresponse 3. django Fbv 和Cbv 一.Django CBV和FBV 在视图中,cbv支持四中method,如下: from django.views import View class

面向对象【day07】:多态-面向对象使用场景--知识点回顾

本节内容 多态 面向对象使用场景 知识点回顾 一.多态 一.概述 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针. 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重用.而多态则是为了实现另一个目的--接口重用!多态的作用,就是为了

java基础知识回顾之面向对象

一 . 抽象类 什么是抽象类?很简单,就是用abstract关键字修饰,并允许包含未实现方法的类. 什么时候定义抽象类?在有些情况下,可能有些方法无法确定要怎么实现,这时就可以定义抽象类,无法实现的方法定义成抽象方法. 抽象类的特性: 1. 不能实例化,即不能创建对象,只能作为父类被继承. 2. 子类继承一个抽象类后,必须实现父类的抽象方法. 3. 抽象类中可以有抽象方法,也可以不包含抽象方法,但如果包含抽象方法,就必须定义成抽象类. public abstract class Shaoe{ p

PHP面向对象关键知识点回顾

一,类中的析构函数(__destruct): 析构函数是自动调用的 析构函数主要用于销毁资源 析构函数的调用顺序是先创建的对象最后被销毁(原理是栈的先进后出) 析构函数什么时候被调用 (1)当程序(进程结束)推出时 (2)当一个对象成为垃圾对象时候,该对象的析构方法也会被调用 (3)所谓垃圾对象,就是指没有任何变量再引用它(没有变量再只指向堆中的对象) (4)一旦对象成为垃圾对象,析构函数就会立即被调用 二,类中使用静态变量(static) 静态变量的引入是为了解决不同的对象实例能够共享同一个变

浅显回顾 Java 面向对象的最后方面的知识

今天主要回顾一下 Java 面向对象的最后一部分的知识,算是对面向对象的一个总结了吧! 先来讲两个关键字吧! 1. abstract 如果一个类的所有子类都对这个类中的某个方法做了重写,那么这个时候这个类中的对应方法可以不定义方法体,需要用abstract修饰方法,从而成为一个抽象方法.抽象方法所在的类必须是抽象类. 抽象类不能创建对象. --- 抽象方法一定是抽象类,但抽象类中不一定有抽象方法. 抽象类一定不是最终类,因为最终类不能被继承. 注意:任何一个类都有构造方法 抽象方法没有方法体,一