javascript中,每个function都拥有一个原型对象prototype,通过这个对象可以为这个类定义各种属性和方法,但是这样定义的属性和方法是所有该类的对象所共有的,效果上和同这个类的父类中继承的字段和方法差不多。通常我们使用function的原型来创建类的方法,而用普通方式来创建类的属性。
1.为什么不用原型来创建属性
因为原型创建的内容是这个类所有对象所共享的,对于一个属性而言,不同的类的对象的值都不一样。如果使用原型对象来创建对象属性,那么任何一个类的对象修改了自己的某个属性,其他对象的相同属性也会被修改。
这么做的本质是因为:属性是各个对象不同的,要求对象自己保存自己该属性的值,而方法对于所有对象而言都是一样的,没有必要每个对象都保存一个方法,只要由类的原型保存一份,各个对象使用方法的时候调用这些方法就可以了。
2.为什么要用原型来保存方法
因为方法对所有类对象来说都是一样的,如果用传统方式定义,那样每个类的对象被定义的时候,该对象都会保存这个方法的信息,这样会耗
费很多资源。而使用原型来保存,所有的方法都保存在原型中,每个对象需要使用方法的时候就调用原型对象中保存的方法。节省了资源。
在类中定义共享的共有方法,私有静态属性和方法,共有静态属性和方法。
//一种更为合适的公用属性和方法的定义,把共有方法在类第一次调用的时候加到类的原型对象中
var Book = function(name){
//公有属性,在构造方法里面来定义,通过this关键字
this.name = name;
//第一次执行该对象的构造方法,这个时候执行下面的代码
//为类的原型对象上定义共有的方法
//所有该类的对象共享相同的共有对象,减小了内存的消耗
if (typeof Book._init == "undefined") {//在第一次定义该类对象的时候会成立
//共有的方法,在原型对象上定义
Book.prototype.setName = function(nname) {
this.name = nname;
};
Book.prototype.getName = function(){
return this.name;
};
Book.prototype.getCount = function(){
addCount();
return count;
};
}
//类已经被定义过了,以后就不再重新定义原型对象上的方法了
Book._init = true;
//利用局部变量来模拟私有静态属性和方法
//这些局部变量定义出来的方法和属性外界不能直接访问,只能通过公有方法访问,
var count = 0;
var addCount = function(){
count++;
}
};
//定义共有静态属性
Book.staticValue = 10;
//定义共有的静态方法
Book.changeValue = function() {
Book.staticValue++;
}
对上面类的调用方法
//这个new操作相当于先创建了一个简单对象,调用了类的构造方法
var book1 = new Book("AJAX");
var book2 = new Book("AJAX1");
alert(book1.getName());
alert(book2.getName());
book1.setName("JAVA");
alert(book1.getName());
alert(book2.getName());
alert(book1.getCount());
alert(book2.getCount());
alert(book1.getCount());
//共有的静态属性和方法要用类名来调用
alert(Book.staticValue);
Book.changeValue();
alert(Book.staticValue);
定义一个对象,希望这个对象拥有一些自己独享的私有信息
方法:直接定义一个匿名的类
//一个单独的对象,期望拥有一些私有有的信息
下面的方法和上面的起到一样的效果,
//利用匿名方法直接调用的方式,来实现一个对象拥有私有的信息
var priObj = (function(name){
//由于这个变量是在方法内定义的,起到的效果就是私有的
var priname = name;
//这个格式要求返回的是一个对象,
//这个对象要求有getName和setName两个方法
return {
getName:function() {
return priname;
},
setName:function(nname) {
priname = nname;
}
};
})("wang");
下面是上面对象的使用方法
//var priObj1=new priObj("a");
//var priObj2=new priObj("b");
上面的做法是错误的,因为这个priObj已经是个定义好的对象了,在定义匿名类的同时就定义好的,所以不能再这么去new了。
//priObj.priname是私有内容,无法访问
alert(priObj.priname);
alert(priObj.getName());
priObj.setName("Lee");
alert(priObj.getName());
alert("");
分享到:
相关推荐
静态私有属性,也称为类私有属性,是指那些属于类的私有属性,而不是属于某个特定实例的。对于所有的实例而言,这个属性是共享的。 要创建静态私有属性,可以通过将变量定义在构造函数外部,然后使用闭包将私有变量...
JavaScript 类定义语法是一种模仿传统面向对象编程语言中的类概念的方式,它允许开发者通过JSON对象来...虽然JavaScript ES6之后引入了原生的类定义语法,但这种模拟类的方法仍然在一些旧项目或特定场景中被广泛使用。
在上面的例子中,`WuYouUser` 是一个模拟类的函数,`this.Name` 表示类的一个属性。 2. **实例化** 要创建一个类的实例,可以使用 `new` 关键字,就像这样: ```javascript var Wo = new WuYouUser(); var ...
在JavaScript面向对象编程中,私有静态变量是一种重要的概念,它允许我们创建只能在类内部访问的变量,而不是让它们成为类的实例的属性。 在JavaScript中,函数自身拥有私有作用域,所以可以使用闭包的特性来实现...
同时,通过闭包可以模拟私有属性和方法,静态属性和方法则通过在构造函数上直接定义。理解这些概念对于编写可维护和扩展的JavaScript代码至关重要。在实际开发中,开发者可以根据需求选择合适的继承策略,并灵活运用...
在JavaScript中,并没有直接支持静态属性和静态方法的语法。但是可以通过构造函数的`prototype`属性来模拟这些特性。 ##### 6.1 静态属性 静态属性可以通过构造函数的`prototype`属性定义: ```javascript ...
在本文中,我们将深入探讨JavaScript中的一些关键面向对象的概念,包括`Object类`、`静态属性`、`闭包`、`私有属性`以及`call`和`apply`方法的使用,同时还会介绍三种实现继承的方法。 首先,`Object类`是...
在JavaScript中,静态成员通常是指那些绑定到类本身而非类的实例上的属性和方法。实际上,JavaScript中并没有严格意义上的静态类,但可以通过函数或对象字面量来模拟实现。静态成员通常通过函数直接访问,而非通过...
在JavaScript中,面向对象编程虽然没有像其他强类型语言那样直接的支持,但是通过一些技巧和模式,我们可以模拟实现类和静态类的概念。本文将详细介绍如何在JavaScript中实现类和静态类。 首先,让我们深入理解...
虽然JavaScript中没有原生的私有属性支持,但可以通过闭包来模拟这一特性。例如: ```javascript function Person(name) { var _name = name; // 私有变量 this.getName = function() { // 公有方法 return _...
- 静态属性和方法以及私有和受保护属性的使用。 - 混入(Mixins)的概念。 **错误处理和异步编程** 对于错误处理和异步编程,教程涵盖了以下内容: - 错误处理和`try..catch`语句。 - 自定义错误和扩展Error对象...
- **类与对象**:JavaScript没有内置的类的概念,但在ES6中引入了`class`关键字来模拟类的行为。对象则是由类实例化出来的具体实体。 - **封装**:封装是指将数据和操作这些数据的方法绑定在一起,隐藏内部状态,只...
JavaScript中的类是从ES6开始引入的,但在此之前,我们通常使用构造函数和原型链来模拟类的概念。类定义了对象的状态(属性)和行为(方法)。对象则是类的实例,它们拥有类定义的属性和方法。 2. 封装 封装是面向...
ES5主要依靠构造函数和原型链来模拟面向对象编程中的类概念,而ES6则正式引入了`class`关键字,使得类的定义更加简洁直观。本文将详细探讨ES5和ES6中类的不同之处,并通过示例代码帮助理解这些差异。 #### 二、ES5...
除了原型和闭包,JavaScript中还有静态属性和方法的概念,它们是附加到函数而非实例上的属性和方法。虽然JavaScript不像C++或C#那样明确区分静态和实例成员,但仍然可以通过特定的方式来实现静态功能。 在学习...