在js中,对象是对象,函数也是对象,对于java程序员来说,这非常容易造成困惑。 而且究竟什么是类呢? js好像也没有一个明确的规范。我目前的理解是,把prototype当作类型接口,但实际上对于js来说,创建一个对象,并不一定需要创建一个新的类型。
这就造成了在js中创建对象的奇怪行为, 最简单的构造方式:
var oObj = new Object();
oObj.attr_1 = "string value";
oObj.attr_2 = 4;
oObj.attr_3 = function() {alert("");}
可是这样便会产生一个问题,对于同一种类型,只能产生一个对象。在面向对象的程序设计里面,这是件搞笑的事情。我们必须想出办法来,可以同时为一个定义的类型产生多个对象:
function createObj() {
var oObj = new Object();
oObj.attr_1 = "string value";
oObj.attr_2 = 4;
oObj.attr_3 = function() {alert(this.attr_1);}
return oObj;
}
var oObj1 = createObj();
var oObj2 = createObj();
看起来很怪异,可这就是js中所谓的“构造函数”。 通过这种方式,我们可以产生多个具有相同的属性和方法的对象。
在这里,这个函数就被当作全局函数来使用,而不是对象。 在做js编程时,我们必须始终在心里有数,我创建的每个函数或者方法,我是打算把它当作什么来用的,是函数还是对象? 这样就不会糊涂了。
上面的代码看上去很美,其实问题多多。 首先是每个属性值都是固定的,对于不同的对象,我们应该可以赋予不同的属性,所以我们把构造函数改一改:
function createObj(sAttr1, nAttr2) {
var oObj = new Object();
oObj.attr_1 = sAttr1;
oObj.attr_2 = nAttr2;
oObj.attr_3 = function() {alert(this.attr_1);}
return oObj;
}
var oObj1 = createObj("string1", 4);
var oObj2 = createObj("string2", 5);
还有一个问题就是,每当我call一次createObj的时候,一个新的方法attr_3就会被创建。 而我们知道,在传统的面向对象设计中,方法是可以重用的。所有的对象都不产生创建自己的方法,而是指向方法堆里面的类记录。
那么在js中,我们该怎么模拟这种情况呢? 看看下面的代码:
function fAttr() {alert(this.attr_1);
function createObj(sAttr1, nAttr2) {
var oObj = new Object();
oObj.attr_1 = sAttr1;
oObj.attr_2 = nAttr2;
oObj.attr_3 = fAttr;
return oObj;
}
var oObj1 = createObj("string1", 4);
var oObj2 = createObj("string2", 5);
这样就对了,属性仅仅是指向一个预先创建好的函数,不会每次都重新创建了。
然而这样看上去还是显得有点奇怪,首先,函数fAttr似乎并不和构造函数融为一体,作为传统面向对象程序员,这样的代码,看着很不爽。
这个时候prototype就派上用场了:
function createObj() {
}
createObj.prototype.attr_1 = 4;
createObj.prototype.attr_2 = "string1";
createObj.prototype.attr_3 = function() {alert(this.attr_1);
var oObj1 = new createObj();
var oObj2 = new createObj();
这段代码保证了所有数据都是在原型中有一份的,那么每个新创建的对象,自然也有一份。在这里,我们要记住,createObj()应该被视为对象,而不是函数.
根据java coding style把代码改规范一点:
function Obj() {
}
Obj.prototype.attr_1 = 4;
Obj.prototype.attr_2 = "string1";
Obj.prototype.attr_3 = function() {alert(this.attr_1);
var oObj1 = new Obj();
var oObj2 = new Obj();
怎么样,像那么回事了吧。但是问题又来了,我们又回到老路上去了,每个对象的属性值又变成固定的了。
我们把刚才使用的两种方式结合起来:
function Obj(a1,a2) {
this.attr_1 = a1;
this.attr_2 = a2;
}
Obj.prototype.attr_3 = function() {alert(this.attr_1);
var oObj1 = new Obj(5, "String1");
var oObj2 = new Obj(6, "String2");
这样把属性和方法分开定义,更加有面向对象的感觉。
但是,极端的完美主义者还是觉得不满意,认为这样的类型定义,没有java中的类定义那么清晰,完美封装。 于是,专为java变态狂设计的方法诞生了:
function Obj(a1,a2) {
this.attr_1 = a1;
this.attr_2 = a2;
if(typeof Obj._inited == "undefined") {
Obj.prototype.attr_3 = function() {alert(this.attr_1);
Obj._inited = true;
}
}
var oObj1 = new Obj(5, "String1");
var oObj2 = new Obj(6, "String2");
特此鸣谢javascript高级程序设计
分享到:
相关推荐
在JavaScript中创建对象的各种模式对于掌握这门语言的面向对象编程特性至关重要。JavaScript作为一门具有面向对象特性的脚本语言,虽然没有传统意义上类的概念,但它通过其他方式实现了对象的创建和继承。在...
在讨论安全性方面,JavaScript中创建对象的模式可能涉及的主要是内存管理和访问控制。例如,使用原型模式可以避免内存浪费,但不恰当的原型链操作可能导致意外的属性访问。在构造函数中定义私有变量和方法,可以防止...
在JavaScript中,创建对象是编程的基本操作之一,它支持多种方式来实现这...以上就是JavaScript中创建对象的一些主要方式,每种方式都有其适用场景和优缺点。理解并熟练掌握这些技巧,能够帮助开发者更高效地编写代码。
JavaScript是基于对象的语言,其能够利用面向对象思想来模拟其他如JAVA、C++等面向对象语言。...以上就是在JavaScript中创建对象的几种主要方法。通过这些方法,我们可以根据不同的需求和场景来灵活地创建和使用对象。
在JavaScript中,创建对象是面向对象编程的基础。虽然JavaScript没有像其他面向对象语言那样的"类"概念,但它提供了多种创建对象的模式,以满足不同场景的需求。这些模式包括工厂模式、构造函数模式、原型模式以及...
在JavaScript中,创建对象是编程的基本操作之一,用于表示数据和功能。本文将详细阐述三种常用的创建对象的方法:字面量语法、构造函数和原型。这些方法各有特点,适用于不同的场景,理解并熟练掌握它们对JavaScript...
以上就是JavaScript中创建对象的各种方法,每种方法都有其适用场景和优缺点。理解并熟练运用这些技巧,将有助于你编写更高效、更易于维护的代码。在实际开发中,可以根据项目需求和团队习惯选择合适的方法。
本文将详细介绍JavaScript中创建对象的七种常见方式,并给出具体的示例代码。 #### 二、通过内置`Object`对象的方式创建 这是最简单直接的方式之一,通过`new Object()`创建一个空对象,之后通过点语法为其添加属性...
在JavaScript中创建对象有多种方式,最简单的一种是直接使用对象字面量来创建。例如: ```javascript var box = { name: 'Lee', age: 100, run: function() { return this.name + this.age + '运行中'; } }; ``...
在JavaScript中创建对象主要有三种方式: 1. 使用对象字面量创建对象 在这种方法中,我们创建一个对象,然后立即添加数据和功能。 ```javascript const player = { name: "John", score: 6, increment: ...
这是当前在JavaScript中创建对象最常见的方式。示例如下: ```javascript function Person(name, age, job) { this.name = name; this.age = age; this.job = job; } Person.prototype.sayName = function() { ...
在阅读给定文件内容后,我们可以总结出以下JavaScript中创建对象的五种方法: 方法一:使用`new Object()`创建对象 这是最基本的创建对象的方法,在这个方法中,我们首先使用`new`关键字来调用`Object()`构造函数,...
本文将深入探讨 JavaScript 中创建对象及对象继承的各种有效策略,特别是如何利用构造函数模式、原型模式以及寄生组合式继承等技术来构建灵活、高效的应用程序。 #### 二、JavaScript 对象与原型 在 JavaScript 中...
JavaScript是一种动态类型的脚本语言,广泛应用于...以上就是JavaScript中创建对象和继承的基本原理和示例。理解这些概念对于编写高效的JavaScript代码至关重要,特别是在处理复杂对象结构和实现面向对象设计模式时。
原型模式利用JavaScript对象的原型链机制来实现对象间的属性和方法共享。所有函数都有一个`prototype`属性,这个属性是一个对象,它的属性和方法可以被所有通过该函数创建的对象共享。例如: ```javascript Person....
本文将深入探讨JavaScript中创建对象的几种常见方式以及对象方法。 首先,我们来看“工厂模式”。工厂模式是一种创建对象的抽象方式,通过一个函数来返回一个新的对象。例如: ```javascript function getObj(name...
JavaScript中创建对象的一个常用方式是使用对象构造器(也称为构造函数)。通过构造函数可以创建出带有特定属性和方法的对象实例。原型是JavaScript面向对象编程的一个核心概念,每个对象都有一个原型对象,通过它...
这个文件可能包含了一些示例代码,用于演示上述的JavaScript对象创建、类定义和继承的实践。通过查看和运行这些代码,你可以更好地理解这些概念并应用到实际项目中。 总结来说,JavaScript对象创建涉及字面量、构造...
在JavaScript中,有几种常见的创建对象的方法,这里我们将详细探讨这些方法。 1. **对象字面量**:这是最简单且直观的创建对象的方式。通过大括号 `{}` 创建一个空对象,然后通过点`.`或方括号`[]`来添加属性和方法...