1.工厂方式
<script type="text/javascript">

function createObject(name){

var p = new Object();

p.name=name;

p.say = function(){alert(p.name+'ff');}

return p;

}

var p1 = createObject("p1");

var p2 = createObject("p2");

alert(p1.name+" "+p2.name);

p1.say();p2.say();

alert(p1.say==p2.say); //false

</script>

问题:每创建一个对象,对象的方法是新对象,浪费资源

2、构造函数方式

<script type="text/javascript">

function Person(name){

this.name = name;

this.say = function(){

alert("I am "+this.name);

}

}

var p1 = new Person("wang");

var p2 = new Person("li");

p1.say();

p2.say();

alert(p1.say==p2.say); //false

</script>

问题:

创建对象时比工厂方法更易于理解。

和工厂方法一样,每个对象都有自己的方法,浪费资源。

3、原型方式

function Person(){}

Person.prototype.name = "";

Person.prototype.say = function(){

alert("I am "+this.name);

}

var p1 = new Person();

var p2 = new Person();

alert(p1.say == p2.say);//true

问题:无法在构造方法中传递参数,所有对象共享属性。

优点:对象共方法,节约资源。

4、构造方法+原型方式

function Person(name){

this.name = name;

}

Person.prototype.say = function(){

alert("I am "+this.name);

}

var p1 = new Person("wang");

var p2 = new Person("li");

p1.say();

p2.say();

alert(p1.say==p2.say); //true

优点:解决了前面提到的问题。

问题:封装不够完美。

5、动态原形方式

function Person(name){

this.name = name;

if(Person.prototype.say == undefined){

Person.prototype.say = function(){

alert("I am "+this.name);

}

}

}

var p1 = new Person("wang");

var p2 = new Person("li");

p1.say();

p2.say();

alert(p1.say==p2.say); //true

结论:一种完美的解决方案。

6、对象的创建 - JSON

var person = {};

var girl = {

name:“miss wang”,

age:20,

show = function(){

alert("my name is " + this.name);

}

}

继承的实现方式

1、  对象冒充

function People(name){

this.name = name;

this.say = function(){

alert("I am "+this.name);

}

}

function WhitePeople(name){

this.inherit = People;

this.inherit(name);

delete this.inherit;

this.color = function(){

alert("I am white people.");

}

}

var p = new WhitePeople("wang");

p.say();

p.color();

alert(p instanceof People); //false

结论:支持多重继承,但后面的类可以覆盖前面类的属性和方法。继承后的对象类型和父类对象不匹配

2、利用call()和apply()冒充

function People(name,age){

this.name = name;

this.age = age;

this.say = function(){

alert("I am "+this.name+"  "+this.age);

}

}

function WhitePeople(name,age){

//People.call(this,name,age);//call方式以多个参数进行传值

People.apply(this,[name,age]);//apply方式以数组方式进行传值

this.color = function(){

alert("I am white people.");

}

}

var p = new WhitePeople("wang",34);

p.say();

p.color();

alert(p instanceof People);

3、原型链继承

//父类

function People(name){

this.name = name;

}

People.prototype.say = function(){

alert("I am "+this.name);

}

//子类

function ChinaPeople(name,area){

People.call(this,name);

this.area = area;

}

ChinaPeople.prototype = new People();

ChinaPeople.prototype.from = function(){

alert("I'am from "+this.area);

}

var p = new ChinaPeople("wang","si chuan");

p.say();

p.from();

alert(p instanceof People); //true

结论:不支持多重继承,继承后的对象类型和父类对象匹配

js自定义类和对象及继承的更多相关文章

  1. Javascript学习6 - 类、对象、继承

    原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...

  2. 类和对象:继承 - 零基础入门学习Python038

    类和对象:继承 让编程改变世界 Change the world by program 上节课的课后作业不知道大家完成的怎样?我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌 ...

  3. 大数据学习day14-----第三阶段-----scala02------1. 元组 2.类、对象、继承、特质 3.函数(必须掌握)

    1. 元组 映射是K/V对偶的集合,对偶是元组的最简单的形式,元组可以装着多个不同类型的值 1.1 特点 元组相当于一个特殊的数组,其长度和内容都可变,并且数组中可以装任何类型的数据,其主要用处就是存 ...

  4. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

  5. 【Python】类和对象、继承、使用文件、存储、异常、标准库(不懂)

    当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self ...

  6. [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要

    C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...

  7. JS创建类和对象

    JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...

  8. JS创建类和对象(好多方法哟!)

    http://www.cnblogs.com/tiwlin/archive/2009/08/06/1540161.html 这是别人写的~~~我借来看看 JavaScript 创建类/对象的几种方式 ...

  9. js- 类数组对象

    JavaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法. 而对于一 ...

随机推荐

  1. mysql 时间戳按指定格式(Y-m-d)取出

    之前做采集脚本,把采集的时间按unix时间戳的形式取出    那么在写sql语句的时候,需要按时间查询相应的记录,页面传进来的$time 是'2014-01'之类的字符串,那么怎么写sql呢 $sql ...

  2. .Net Service部署(二)

    1. 以管理员权限运行cmd.exe2. 安装服务 安装服务需要注意的是,如果电脑已经安装了此服务,需要先停止服务然后删除服务, 在进行安装注册,注册前先运行  cd C:\Windows\Micro ...

  3. Python 整理一

    ---恢复内容开始--- Python (pailen)最近学习这个语言,其实早在几年前学习perl的时候就知道有这个语言了,在讲perl的那本书后面就推荐学习python,并且还附加了二章的入门.当 ...

  4. 修改jquery的remote让前段显示服务器错误信息

    remote: function (value, element, param) { //param 是你的rules中规定的参数,在这里肯定是remote中的参数了 //value是你输入的值 // ...

  5. Python Challenge 过关心得(0)

    最近开始用Openerp进行开发,在python语言本身上并没有什么太大的进展,于是决定利用空闲时间做一点python练习. 最终找到了这款叫做Python Challenge(http://www. ...

  6. 数据库sqlite的使用

    #import <Foundation/Foundation.h> @class student; @interface DataBaseHandle : NSObject //设置单例 ...

  7. android事件详解

    http://blog.csdn.net/asce1885/article/details/7596669 http://blog.csdn.net/liranke/article/details/6 ...

  8. SonarQube代码质量管理平台工具

    1.Sonar轮廓介绍 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量.Sonar 不只是一个质量数据报告工具,更是代码质量管理平台.支持的语言包括:Java.PHP.C#.C ...

  9. Cocos2d-x--Box2D绘制出两个矩形框的解决方案

    一个简单的Demo,只是在程序窗口绘制出一个矩形 找到以下代码,注释掉其中一句 效果:

  10. Javascript自由拖拽类

    基本拖拽配置 new Dragdrop({target 拖拽元素 HTMLElemnt 必选bridge 指定鼠标按下哪个元素时开始拖拽,实现模态对话框时用到 dragable 是否可拖拽 (true ...