关于创建对象:
1:构造函数的方式
/**
* 构造函数的方式
*/
/**
*构造方法 的缺点是,构造出的实例都会有一份方法(对象)。这是没必要的
*/
function Person(name,age){
this.name=name;
this.age=age;
this.sayHello=function(){
alert(this.name);
}
}
var p=new Person("n",1);
2:构造与原型混合的方式
/**
* 构造与原型混合的方式
*/
/**
*构造与原型混全合的方式实现了实例共用一份方法(对象)的功能。
*/
function Person(name,age){
this.name=name;
this.age=age;
}
Persona.prototype={
sayHello:function(){
alert(this.name);
}
}
var p1=new Person("x",1);
var p2=new Person("y",2);
alert(p1.sayHello===p2.sayHello);//true;
3:动态原型模式
/**
* 动态原型模式
*/
/**
*动态原型模式将构造与原型混合的模式做了调整,组合到了一起,更优雅一些。
* @param {Object} name
* @param {Object} age
*/
function Person(name,age){
//属性
this.name=name;
this.age=age;
//方法
if(typeof this.sayHello != "function"){
Person.prototype=function(){
alert(this.name);
}
}
}
关于继承
1:原型链实现继承
/**
*原型链实现继承
* 1:原型链虽然很强大,可以用它来实现继承,但它也存在一些问题。其中,最主要的问题来自包含
* 引用类型值的原型。
* 引用类型值的属性会被所有的实例共享,所以一般会将它放在构造函数中,而不是放在原型对象中。但
* 通过原型来实现继承时,原型实现上会变成另一个类型的实例。原先的实例属性也就顺理成章地变成了现在的原型属性
* 2:在创建子类型的实例时,没有办法在不影响所有对象实例的 * 情况下,给超类型的构造函数传递参数。
* 所以,实践中很少会单独使用原型链
*/
function SuperType(){
this.colors=["red","blue","green"];
}
function SubType(){
}
SubType.prototype=new SuperType();
var s1=new SubType();
s1.colors.push("black"); //red,blue,green,black
alert(s1.colors);
var s2=new SubType();
alert(s2.colors);//red,blue,green,black
2:借用构造函数
/**
*借用构造函数
*/
/**
*构造函数刚好可以解决原型链继承所面临的两个问题。但是构造函数也有缺点。
* 方法都在构造函数中定义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,
* 对子类型而言也是不可见的,结果所有类型都只能使用构造函数模式。考虑这些问题,构造函数实现继承也是很少单独使用的。
*
*/
function SuperType(){
this.colors=["red","blue","green"];
}
function SubType(){
SuperType.call(this);
}
var s1=new SubType();
s1.colors.push("black");
alert(s1.colors); //"red,blue,green,black"
var s2=new SubType();
alert(s2.colors); "red,blue,green";
3:组合继承
/**
*组合继承
* 将原型链和借用构造函数组合到一块。使用原型链实现对原型属性和方法的继承,
* 而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数利用,
* 又能够保证每个实例都有它自己的属性。
*
* 组合继承的缺点:
* 无论什么情况下,都会调用两次超类型的构造函数:一次是在创建类型原型的时候,另一个次是在子类型的构造函数内部。
* 不仅如此,超类型的属性会在子类型和原型里同时存在,这是没有必要的。
*/
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.sayAge=function(){
alert(this.age);
}
var s1=new SubType("n",1);
s1.colors.push("black");
alert(s1.colors);//red,blue,green,black
s1.sayName();
s1.sayAge();
var s2=new SubType("Greg",2);
alert(s2.colors);//red,blue,green,black
s2.sayName();
s2.sayAge();
4:寄生组合式继承
/**
*寄生组合式继承
*
* 解决了组合继承的缺点,它只调用了一次SuperType构造函数,并且因此避免了在SubType.prototype
* 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;
*/
function object(o){
function F(){}
Function.prototype=o;
return new F();
}
function inheritPrototype(subType,superType){
var prototype=object(superType,prototype);
prototype.constructor=subType;
SubType.prototype=prototype;
}
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);
}
摘自《javascript 高级程序设计》
PS:关于寄生组合式继承,让我不自觉想到了甘露模型,因为太像勒。大概Nicholas C.Zakas写《javascript高级程序设计》前也像李战一样得到了观音的指点。
分享到:
相关推荐
### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...
### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...
### JavaScript面向对象要点总结 在JavaScript中,面向对象编程(OOP)是一种广泛采用的编程范式,它允许开发者创建可重用、模块化的代码。本文将深入探讨JavaScript面向对象的关键概念,包括构造函数、原型链、...
### JavaScript面向对象精要 #### 一、概述 《JavaScript面向对象精要》是一本深入讲解JavaScript面向对象编程原理的专业书籍。本书由知名的前端开发者Nicholas C. Zakas撰写,全面介绍了JavaScript作为一种动态...
### JavaScript面向对象编程详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发领域占据着举足轻重的地位。尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得...
### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...
根据提供的文件信息,我们将重点放在面向对象编程(OOP)在JavaScript中的应用上。JavaScript作为一种广泛使用的脚本语言,不仅在浏览器环境中发挥着重要作用,在服务器端开发(如Node.js)及桌面应用程序开发等领域也...
从所提供的文件信息中,我们可以总结以下几点与“JavaScript面向对象编程指南 第2版 高清 带索引书签目录_样章.pdf”相关的重要知识点。 首先,该文件提到的书籍是关于JavaScript面向对象编程的,面向对象编程...
总结来说,JavaScript面向对象编程涵盖了从基本原理到实现细节的多个方面,包括但不限于对象、构造函数、原型链、继承以及封装等。本书系统地介绍了这些知识点,并通过实例演示了如何在现代JavaScript中实现OOP,...
本文总结了基于闭包的JavaScript面向对象编程框架的设计和实现。通过使用闭包,实现了基于类的面向对象编程的封装、继承和多态特征。 闭包(Closure)是JavaScript中的一种编程技术,通过闭包,可以实现基于类的...
### JavaScript面向对象编程详解 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种程序设计范式,其核心思想是将数据与处理这些数据的方法封装在一起,形成一个个对象。在...
最后,`demo.html`可能是一个示例网页,展示了如何在实际项目中使用上述的JavaScript面向对象编程技术。它可能包含了HTML结构,以及引入`JSLogger.js`的脚本,通过创建和操作对象来展示其功能。 总的来说,这篇博客...
### JavaScript面向对象编程详解 #### 一、引言 随着Web技术的发展,特别是Ajax的兴起,JavaScript作为一种在浏览器端执行的脚本语言,其地位变得越来越重要。在现代Web应用中,JavaScript不再仅仅用于简单的页面...
总结来说,JavaScript的面向对象编程主要包括以下几个方面: 1. **通过函数定义类**:函数作为构造器,用于初始化对象。 2. **`new`操作符创建对象**:`new`操作符调用构造函数并返回新对象,实现类的实例化。 3. *...
面向对象编程(Object-Oriented Programming, OOP)是JavaScript中的核心概念,而设计模式则是解决常见编程问题的经验总结,对于提升代码质量和可维护性至关重要。这两本书——"JavaScript 面向对象编程.pdf"和...