JavaScript面向对象程序设计

理解对象

  • 通用属性
    1. configurable: 表示能否修改属性的特性或可以被删除
    2. Enumerable:表示能否通过 for-in 循环遍历属性
  • data descriptor:
    1. Writable:表示能否修改属性的值
    2. Value:包含这个属性的值
  • accessor descriptor
    1. get: 获取属性值
    2. set: 设置属性值

备注:data descriptor和accessor descriptor 不能同时存在,如果同时存在会报[TypeError: property descriptors must not specify a value or be writable when a getter or setter has been specified]

在JavaScript中创建对象的方式

1.  工厂模式

function createPerson(name, age, job) {
	var person = new Object();
	person.name = name;
	person.age = age;
	person.job = job;
	person.toString = function() {
		console.log("name:"+name+", age:"+age+", job:"+job);
	}

	return person;
}
var person = createPerson("David", 22, "Engineer");
person.toString();

2.  构造函数模式

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.toString = sayInfo;
}

function sayInfo() {
    console.log("name:"+this.name+", age:"+this.age+", job:"+this.job);
}
var person = new Person("David", 33, "Artist");
person.toString();

3.  原形模式

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    if(typeof this.sayName != "function") {
        Person.prototype.sayName = function() {
            console.log(this.name);
        }
    }
}

var person = new Person("David", 32, "Engineer");
person.sayName();

JavaScript中的对象继承模式

1.  原型链:

function SuperType() {
	this.superProperty = true;
	this.colors = ["red", "blue"];
}
SuperType.prototype.saySuperProperty = function() {
	console.log(this.superProperty);
}
function SubType() {
	this.subProperty = false;
}

SubType.prototype = new SuperType();

SuperType.prototype.saySubProperty = function() {
	console.log(this.subProperty);
}

var sb1 = new SubType();
var sb2 = new SubType();

sb1.saySuperProperty();  //true
sb1.saySubProperty();    //false

sb2.saySuperProperty();  //true
sb2.saySubProperty();    //false

sb1.colors.push("white");
console.log("sb1 "+sb1.colors);   // "sb1 red,blue,white"
console.log("sb2 "+sb2.colors);   // "sb2 red,blue,white"

2.  借用构造函数:

function say_hello(){
	 alert("Hello RunJS!");
}

function SuperType(name) {
	this.name = name;
	this.colors = ["red","yellow"];
}

function SubType(name) {
	SuperType.call(this);
}

var sb1 = new SubType("David");
var sb2 = new SubType("Bill");

sb1.colors.push("Black");
sb2.colors.pop();

console.log("sb1.colors: "+sb1.colors);  // "sb1.colors: red,yellow,Black"
console.log("sb2.colors: "+sb2.colors);  // "sb2.colors: red"

3.  组合继承:

function say_hello(){
	 alert("Hello RunJS!");
}

function SuperType(name) {
	this.name = name;
	this.colors = ["red","yellow"];
}

SuperType.prototype.sayName = function() {
	console.log(this.name);
}
function SubType(name) {
	SuperType.call(this, name);
}

SubType.prototype = new SuperType();
var sb1 = new SubType("David");
var sb2 = new SubType("Bill");

sb1.sayName();  //"David"
sb2.sayName();  //"Bill"

sb1.colors.push("Black");
sb2.colors.pop();

console.log("sb1.colors: "+sb1.colors);  // "sb1.colors: red,yellow,Black"
console.log("sb2.colors: "+sb2.colors);  // "sb2.colors: red"

4.  原形式继承:可以在不必预先定义构造函数的情况下实现继承,其本质是执行对给定对象的浅复制。而复制得到的副本还可以得到进一步改造。

function object(o){
	function F(){}
	F.prototype = o;
	return new F();
}

var person = {
	name: "Nicholas", friends: ["Shelby", "Court", "Van"]
};
// var anotherPerson = object(person);
var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

// var yetAnotherPerson = object(person);
var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");

alert(person.friends); //”Shelby,Court,Van,Rob,Barbie”

5.  寄生式继承:与原形式继承非常相似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用。

function object(o){
	function F(){}
	F.prototype = o;
	return new F();
}
function createAnother(original){
	var clone = object(original); //create a new object by calling a function
	clone.sayHi = function(){ //augment the object in some way
		alert("hi");
	};
	return clone; //return the object
}
var person = {
	name: "Nicholas",
	friends: ["Shelby", "Court", "Van"]
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi(); //"hi"

6.  寄生组合式继承:集寄生式继承和组合继承的优点于一身,是实现基于类型继承的最有效方式。

function object(o){
	function F(){}
	F.prototype = o;
	return new F();
}
function inheritPrototype(subType, superType){
	var prototype = object(superType.prototype); //create object
	prototype.constructor = subType; //augment object
	subType.prototype = prototype; //assign object
}
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;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function(){
	alert(this.age);
};

var sb1 = new SubType("David", 15);
sb1.sayName();
sb1.sayAge();

JavaScript面向对象程序设计,布布扣,bubuko.com

时间: 2024-11-06 02:21:30

JavaScript面向对象程序设计的相关文章

javascript面向对象程序设计——继承初步(by vczero)

上一篇说了javascript的封装,没有刻意去说javascript的“共有函数”.“私有函数”,因为个人觉得这只是作用域的问题,我们不能刻意的模仿强类型语言(C++/JAVA)而去编写代码.尊重每一门语言的特性才是最为重要的. 一.基于prototype原型的继承 1 var Person = function(name, age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 Person.prototype = { 7 addUser: f

JavaScript 面向对象程序设计(下)——继承与多态 【转】

JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论一下面向对象程序设计中的另外两个要素:继承与多态. 1 又是几个基本概念 为什么要说又呢? 在讨论继承时,我们已经列出了一些基本概念了,那些概念是跟封装密切相关的概念,今天我们要讨论的基本概念,主要是跟继承与多态相关的,但是它们跟封装也有一些联系. 1.1 定义和赋值 变量定义是指用 var a;

javascript面向对象程序设计——封装(by vczero)

在javascript中,我们宣称是面向对象的程序设计.其实面向对象是js与生俱来的特性,每一门OOP语言都有自己的特性,我们不能为了OOP,去模仿另一门语言,把握语言的特性才是正道.我们可以通过new Object()来创建一个实例,但是不推荐这种形式,我们需要更为直观的数据封装. 一.封装你的数据特性 1 var user = { 2 name: '', 3 email: '' 4 }; 很简单,我们封装了一个JSON格式的对象,也称为字面量对象:User对象包含两个属性name和email

JavaScript面向对象程序设计:数组

或许你会奇怪,面向对象的程序设计为什么从数组开始讲起?这是因为……其间的种种关系吧……嘿嘿,这里先卖个关子,先来看看我们熟悉的数组在JavaScript里面是什么样子的. 1. 创建数组 在JavaScript中有很多创建数组的方法.比如使用Array函数.不过这不是现在我们要讲述的.现在我们使用简单的方括号“[]”的办法来创建数组. Js代码 [javascript] view plaincopy 1.var objAyyar = []; // 1 2.var objAyyar = [2]; 

javascript面向对象程序设计系列(一)---创建对象

javascript是一种基于对象的语言,但它没有类的概念,所以又和实际面向对象的语言有区别,面向对象是javascript中的难点之一.现在就我所理解的总结一下,便于以后复习: 一.创建对象 1.创建自定义对象最简单的方式就是创建Object的实例,并在为其添加属性和方法,如下所示: var cat = new Object(); //以猫咪为对象,添加两个属性分别为猫咪姓名和猫咪花色,并添加一个方法,说出猫咪的姓名 cat.name = "cc"; cat.color = &quo

javascript——面向对象程序设计(2)

1 <script type="text/javascript"> 2 //1.理解原型对象 3 //2.原型与in操作符 4 //3.更简单的原型语法 5 //4.原型的动态性 6 //5.原生对象原型 7 //6.原型对象的问题 8 9 //1.无论什么时候,只要创建了一个函数,就会根据一组特定的规则,为该函数创建一个prototype属性,该属性指向函数的原型对象 10 //在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包

javascript——面向对象程序设计(3)

1 <script type="text/javascript"> 2 //1.结合使用构造函数模式和原型模式 3 //2.动态原型模式 4 //3.计生构造函数模式 5 6 //创建自定义类型的常见方式就是组合使用构造函数模式和原型模式.构造函数模式用于定义是实例属性,而原型模式用于定义 7 //实例属性,而原型用于定义方法和共享的属性.结果,每个实例都会有自己的副本,但同时又共享着对方法的引用,节省内存. 8 9 function Person(name, age, j

javascript——面向对象程序设计(1)

1 <script type="text/javascript"> 2 //ECMA-262把对象定义为:“无序属性的 集合,其属性可以包含基本值.对象或者函数” 3 //理解对象,最简单的方式就是通过创建一个Object的实例,然后为它添加属性和方法 4 var person = new Object(); 5 person.name = "Xulei"; 6 person.age = "23"; 7 person.job = &q

javascript——面向对象程序设计(4)

1 <script type="text/javascript"> 2 //1.继承 3 //2.原型链 4 //3.借用构造函数 5 //4.组合继承 6 //5.原型式继承 7 //6.寄生式继承 8 9 //1.继承是OO中最让人津津乐道的概念.许多OO语言都支持两种继承方式:接口继承和实现继承. 10 //接口继承只支持方法签名,而实现继承则继承实际的方法. 11 //由于函数没有签名,所以在ECMAScript中无法实现接口继承,只支持实现继承,而且其实现继承主要