`
零度弥合
  • 浏览: 20639 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

JS构造函数与原型

 
阅读更多

原文链接:http://blog.csdn.net/kkdelta/article/details/8456879

 

JavaScript中定义"类"的时候可以通过构造函数和原型的方式来实现,它们之间有何区别和利弊呢?

首先来看一个通过构造函数实现类定义的例子:

function Car(color,model,drivers){
	this.color=color;
	this.model=model;
	this.drivers=drivers;
	
	this.blar = function(){
		alert("I am a car: " + model + " in " + color + ". " + drivers + " can drive me" );
	}
}

var car1 = new Car('red','BMW',['Mike','Kevin']);
car1.blar();

var car2 = new Car('red','BMW',['Mike','Kevin']);
car2.blar();

 

在上面的例子中,每一个实例中,函数blar都会拷贝到实例中,弊端就是浪费内存。
在来看一个通过利用prototype来定义类的例子:

function Drivers(){
    var names="";
    this.addDriver= function(name){
        names = names +" " + name;
    }
    this.toString = function(){
        return  names;
    }
}


function Car(){
}

Car.prototype.color = "red";
Car.prototype.model = "BMW";

//Car.prototype.drivers = ['Mike','Kevin'];

Car.prototype.drivers =new Drivers();

Car.prototype.blar = function(){
        alert("I am a car: " + this.model + " in " + this.color + ". " + this.drivers + " can drive me" );
    };

var car1 = new Car();
car1.color='Blue';
//car1.drivers.push('Luios');
car1.drivers.addDriver('Mike');
car1.drivers.addDriver('Kevin');
car1.drivers.addDriver('Luios');

car1.blar();//outputs I am a car: BMW in Blue. Mike,Kevin,Luios can drive me
var car2 = new Car();
car2.blar(); //outputs I am a car: BMW in red. Mike,Kevin,Luios can drive me

 prototype方式定义的方式,函数不会拷贝到每一个实例中,所有的实例共享prototype中的定义,节省了内存。但是属性如果是对象的话,所有实例也是共享同一个对象,

如上例中的drivers使用自定义对象或者数组的时候,如果其中某一个实例改变了其中的值,所有的实例的值都被改变。因为所有实例的属性指向的是同一个对象的引用,如果上面的例子中car2.drivers=['Ivy','Lili'];来改变实例car2的属性内容,相对于car2.drivers指向了另一个对象(这时候car2有一个实例属性,有一个prototype属性都是drivers)。
Javascript是一种动态语言,实例创建之后可以动态添加属性和方法,在“构造函数”的定义之外也可以添加属性和方法。其实,下面例子中sayHi本身也是一个全局的类型为Function的实例。

 

 

var obj = {};
obj.prop="value";
obj.test = function(){
	alert("test function: " + this.prop);
}
obj.test();

function sayHi() {
	alert("hi");
}

sayHi.sayHello = function() {
	alert("hello");
};
sayHi.sayHello();//outputs hello

 注意如果想让添加的属性或者方法能够被实例使用,要使用prototype添加,下面的例子说明了这一点

function sayHi() {
	alert("hi");
}

sayHi.sayHello = function() {
	alert("hello");
};

sayHi.sayHello();//outputs hello

var osayHi = new sayHi();//outputs hi
osayHi.sayHello(); // TypeError: osayHi.sayHello is not a function

 因为不是通过在prototype中以这样的方式添加的(sayHi.prototype.sayHello),实例是不能访问sayHello方法的,只能通过sayHi.sayHello(类似如静态方法)的方式访问。同样如果添加的时候是通过prototype方式,则不能用静态方式访问。 

function sayHi() {
	alert("hi");
}

sayHi.prototype.sayHello = function() {
	alert("hello");
};

var osayHi = new sayHi();// outputs hi
osayHi.sayHello(); // outputs hello

sayHi.sayHello(); //TypeError: sayHi.sayHello is not a function

 

 

分享到:
评论

相关推荐

    JavaScript构造函数和原型对象介绍.md

    JavaScript构造函数和原型对象介绍,对于构造函数的创建以及一些简单地介绍,还有就是原型对象对于构造函数的一些补充。

    Js构造函数、原型链、Ajax笔记

    深入浅出的讲解JavaScript中最难理解的Js构造函数、原型链、Ajax三大部分

    JS构造函数与原型prototype的区别介绍

    JavaScript中的构造函数和原型(prototype)是两种不同的机制,它们共同作用于对象的创建和功能扩展。理解这两者的区别对于深入学习JavaScript至关重要。 首先,**构造函数** 是一种特殊类型的函数,用于创建和初始化...

    深入理解javascript构造函数和原型对象

    在深入理解JavaScript的过程中,构造函数和原型对象是两个核心概念。JavaScript是一种基于对象(Object-based)和原型(Prototype-based)的语言,其对象模型与传统的基于类(Class-based)语言有所不同。理解构造...

    JavaScript中构造函数与原型链之间的关系详解

    3. 构造函数与原型的联系: - 构造函数的`prototype`属性定义了新创建的对象实例将继承的属性和方法。`demo.prototype`就是为`Demo`构造函数的实例提供继承属性的对象。 - 原型对象有一个`constructor`属性,它...

    构造函数 原型对象 实例、图解

    JavaScript 构造函数、原型对象和实例之间的关系详解 在 JavaScript 中,构造函数、原型对象和实例之间存在着紧密的关系,这三个概念息息相关。下面我们将详细解释它们之间的关系。 构造函数 在 JavaScript 中,...

    构造函数、函数原型、函数实例三者之间的关系!

    构造函数、函数原型、函数实例三者之间的关系!详细的后续补上

    构造函数以及原型基础

    ### 构造函数以及原型基础 ...通过以上介绍可以看出,理解构造函数和原型的基本概念及其使用方式对于高效地开发JavaScript程序至关重要。这些基础知识不仅帮助我们更好地组织代码,还能有效地管理内存资源。

    TigerHee#shareJS#构造函数和原型1

    构造函数和原型构造函数构造函数通过原型分配的函数是所有对象所共享的JS规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,注意这个proto

    构造函数和实例

    3. 构造函数与原型链: 每个构造函数都有一个prototype属性,它是一个指针,指向一个原型对象。当构造函数创建新实例时,实例的内部[[Prototype]]指针会指向这个原型对象。这意味着所有通过同一个构造函数创建的...

    javascript构造函数以及原型对象的理解

    以下是一个构造函数的例子 如果是实例方法,不同的实例化,它们引用的地址是不一样的,是唯一的。 //定义一个构造函数 function People(name,age){ this.name=name; this.age=age; this.dothings=function(){ ...

    jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承

    构造函数用于创建具有特定属性和方法的新对象,而原型链则是JavaScript用来实现继承的一种方式。在JavaScript中,每个对象都链接到一个原型对象,并从原型对象继承属性和方法。当尝试访问对象的某个属性或方法时,...

    基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解

    构造函数、原型实现继承的缺陷 首先来分析构造函数和原型链两种实现继承方式的缺陷: 构造函数(对象冒充)的主要问题是必须使用构造函数方式,且无法继承通过原型定义的方法,这不是最好的选择。不过如果使用原型链...

    js构造函数constructor和原型prototype原理与用法实例分析

    主要介绍了js构造函数constructor和原型prototype原理与用法,结合实例形式分析js构造函数constructor和原型prototype基本原理、功能、使用方法及操作注意事项,需要的朋友可以参考下

    Javascript 设计模式之构造函数模式.zip

    总结,JavaScript的构造函数模式是创建对象的主要方式之一,它结合原型和原型链提供了面向对象编程的基础。理解并掌握这一模式有助于编写可维护、可扩展的代码。在实际开发中,构造函数模式常常与其他设计模式(如...

    浅谈js构造函数的方法与原型prototype

    综上所述,通过理解JavaScript构造函数和原型prototype的工作机制以及它们的适用场景,开发者可以更加高效地编写出性能优良、易于维护的代码。同时,合理利用构造函数和原型链的组合,将有利于实现代码的复用和减少...

    JavaScript原型对象、构造函数和实例对象功能与用法详解

    本文实例讲述了JavaScript原型对象、构造函数和实例对象功能与用法。分享给大家供大家参考,具体如下: 大家都知道,javascript中其实并没有类的概念。但是,用构造函数跟原型对象却可以模拟类的实现。在这里,就先...

    js定义类 对象 构造函数,类的继承

    在JavaScript中,类(Class)、对象(Object)和构造函数(Constructor)是面向对象编程的基础。这篇文章将深入探讨这三个概念,以及如何实现类的继承。 首先,让我们理解什么是JavaScript中的对象。在JavaScript中...

Global site tag (gtag.js) - Google Analytics