浅析JavaScript中的类型和对象_javascript技巧

JavaScript是基于对象的,任何元素都可以看成对象。然而,类型和对象是不同的。本文中,我们除了讨论类型和对象的一些特点之外,更重要的是研究如何写出好的并且利于重用的类型。毕竟,JavaScript这种流行的脚本语言如果能够进行良好的封装,并形成一个庞大的类型库,对于重用是非常有意义的。

网上对于prototype的文章很多,一直没明白核心的思想。最后写了很多例子代码后才明白:prototype只能用在类型上。

以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:


 

例子代码

说明

1

Object.prototype.Property = 1;
Object.prototype.Method = function ()

{

    alert(1);

}

 

var obj = new Object();

alert(obj.Property);

obj.Method();


可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。

JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String


2

var obj = new Object();
obj.prototype.Property = 1; //Error

//Error

obj.prototype.Method = function()

{

    alert(1);

}


在实例上不能使用prototype,否则发生编译错误

3

Object.Property = 1;

Object.Method = function()

{

    alert(1);

}

 

alert(Object.Property);

Object.Method();


可以为类型定义“静态”的属性和方法,直接在类型上调用即可

4

Object.Property = 1;

Object.Method = function()

{

    alert(1);

}

var obj = new Object();

alert(obj.Property); //Error

obj.Method(); //Error


实例不能调用类型的静态属性或方法,否则发生对象未定义的错误。

5

function Aclass()

{

this.Property = 1;

this.Method = function()

{

    alert(1);

}

}

var obj = new Aclass();

alert(obj.Property);

obj.Method();


这个例子演示了通常的在JavaScript中定义一个类型的方法

6

function Aclass()

{

this.Property = 1;

this.Method = function()

{

    alert(1);

}

}

Aclass.prototype.Property2 = 2;

Aclass.prototype.Method2 = function

{

    alert(2);

}

var obj = new Aclass();

alert(obj.Property2);

obj.Method2();


可以在外部使用prototype为自定义的类型添加属性和方法。

7

function Aclass()

{

this.Property = 1;

this.Method = function()

{

    alert(1);

}

}

Aclass.prototype.Property = 2;

Aclass.prototype.Method = function

{

    alert(2);

}

var obj = new Aclass();

alert(obj.Property);

obj.Method();


在外部不能通过prototype改变自定义类型的属性或方法。

该例子可以看到:调用的属性和方法仍是最初定义的结果。


8

function Aclass()

{

this.Property = 1;

this.Method = function()

{

    alert(1);

}

}

var obj = new Aclass();

obj.Property = 2;

obj.Method = function()

{

    alert(2);

}

alert(obj.Property);

obj.Method();


可以在对象上改变属性。(这个是肯定的)

也可以在对象上改变方法。(和普遍的面向对象的概念不同)


9

function Aclass()

{

this.Property = 1;

this.Method = function()

{

    alert(1);

}

}

var obj = new Aclass();

obj.Property2 = 2;

obj.Method2 = function()

{

    alert(2);

}

alert(obj.Property2);

obj.Method2();


可以在对象上增加属性或方法

10

function AClass()

{

       this.Property = 1;

       this.Method = function()

       {

              alert(1);

       }

}

 

function AClass2()

{

       this.Property2 = 2;

       this.Method2 = function()

       {

              alert(2);

       }

}

AClass2.prototype = new AClass();

 

var obj = new AClass2();

alert(obj.Property);

obj.Method();

alert(obj.Property2);

obj.Method2();


这个例子说明了一个类型如何从另一个类型继承。

11

function AClass()

{

       this.Property = 1;

       this.Method = function()

       {

              alert(1);

       }

}

 

function AClass2()

{

       this.Property2 = 2;

       this.Method2 = function()

       {

              alert(2);

       }

}

AClass2.prototype = new AClass();

AClass2.prototype.Property = 3;

AClass2.prototype.Method = function()

{

       alert(4);

}

var obj = new AClass2();

alert(obj.Property);

obj.Method();


这个例子说明了子类如何重写父类的属性或方法。

以上例子中,关于通过类型实现重用方面,重要的有:
·例子1:JavaScript中允许添加行为的类型
·例子2:prototype使用的限制
·例子3:如何定义类型上的静态成员
·例子7:prototype在重定义类型的成员上的限制
·例子10:如何让一个类型继承于另一个类型
·例子11:如何在子类中重新定义父类的成员

JavaScript能够实现的面向对象的特征有:
·公有属性(public field)
·公有方法(public Method)
·私有属性(private field)
·私有方法(private field)
·方法重载(method overload)
·构造函数(constructor)
·事件(event)
·单一继承(single inherit)
·子类重写父类的属性或方法(override)
·静态属性或方法(static member)

时间: 2024-11-08 18:57:41

浅析JavaScript中的类型和对象_javascript技巧的相关文章

浅析JavaScript中浏览器的兼容问题_javascript技巧

浏览器兼容性问题是在实际开发中容易忽略而又最重要的一部分.我们在讲老版本浏览器兼容问题之前,首先要了解什么是能力检测,它是来检测浏览器有没有这种能力,即判断当前浏览器是否支持要调用的属性或者方法.下面做了一些简短的介绍. 1.innerText 和 innerContent 1)innerText 和 innerContent 的作用相同 2)innerText IE8之前的浏览器支持 3)innerContent 老版本的Firefox支持 4)新版本的浏览器两种方式都支持 1 // 老版本浏

深入浅析JavaScript中的作用域和上下文_javascript技巧

javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性.每个函数有不同的变量上下文和作用域.这些概念是javascript中一些强大的设计模式的后盾.然而这也给开发人员带来很大困惑.下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们. 上下文(Context)和作用域(Scope) 首先需要知道的是,上下文和作用域是两个完全不同的概念.多年来,我发现很多开发者会混淆这两个概念(包括我自己),

浅析JavaScript中的array数组类型系统_javascript技巧

前面的话 数组是一组按序排列的值,相对地,对象的属性名称是无序的.从本质上讲,数组使用数字作为查找键,而对象拥有用户自定义的属性名.javascript没有真正的关联数组,但对象可用于实现关联的功能 Array()仅仅是一种特殊类型的Object(),也就是说,Array()实例基本上是拥有一些额外功能的Object()实例.数组可以保存任何类型的值,这些值可以随时更新或删除,且数组的大小是动态调整的 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javasc

javascript中Function类型详解_javascript技巧

Function 类型 function类型,毋庸置疑是js中相当重要的一个玩意. 1.这玩意首先是一个对象,也就是说它是一个引用类型.陈述:一听说是对象,是不是很有一种它的基类是object对象错觉感,No, 它和object是独立的2个东西.当你typeof function 时,返回的是 funciton 并非 object 2.每个函数都是 Function 对象的一个实例,它与其他引用对象一样具有属性和方法.由于它是对象所以函数名是指向函数对象的指针 关于函数的声明的语法支持: <sc

浅谈Javascript中Object与Function对象_javascript技巧

1.Object对象   原型对象           原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javascript"> Object.prototype.num= 10; alert("添加原型对象属性:"+ Object.num); Object.num = 20; alert("添加对象属性:"+Object.num); <

深入浅析JavaScript中with语句的理解_javascript技巧

JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变作用域链.减少的重复输入. 其语法结构为: with(object){ //statements } 举一个实际例子吧: with(document.forms[]){ name.value = "lee king"; address.value = "Peking";

浅析JavaScript中的隐式类型转换_javascript技巧

如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 .google和维基百科中没有找到"显示类型转换","隐式类型转换"的字眼.暂且这么称呼. 一. 运算中存在的隐式类型转换 1, "+"运算符 复制代码 代码如下: var a = 11, b = '22'; var c = a + b; 这里引擎将会先把a变成字符串"11"再与b进行连接,变成了"1122".

浅析JavaScript中的同名标识符优先级_javascript技巧

一,局部变量先使用后声明,不影响外部同名变量 复制代码 代码如下: var x = 1; // --> 外部变量x function fn(){     alert(x);  // --> undefined 局部变量x先使用     var x = 2; // 后声明且赋值 } fn(); alert(x); // --> 1<BR> 第一点,函数fn内第一句输出x,x是在第二句才定义的.这在JS中是允许的,这里的允许是指不会出现语法错误程序可以运行. 但在其它语言如C,J

浅析JavaScript中作用域和作用域链_javascript技巧

学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别. 一.js没有块级作用域. js没有块级作用域,就像这样: if(){ var a = 100: console.log(a) //输出100 } console.log(a) //输出100 js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域. 二.js的全局变量 js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代