`

JS类中定义原型方法的两种实现的区别

    博客分类:
  • Ajax
阅读更多
我们知道,给JavaScript类添加原形(prototype)方法是很简单的。而且常用的有下面这两种方法,可是这两种方法在使用时有区别吗?
JScript Class:
function JSClass()
{
}
Extends prototype method:
JSClass.prototype.MethodA = function()
{
};
Or
function = JSClass.prototype.MethodA()
{
};
其实这两个原形定义方式可以简化一下来讨论,先把它们看作是两个函数,如下:
Foo1();
function Foo1()
{
alert(’This is Foo1.’);
}
和 Foo2();
var Foo2 = function()
{
alert(’This is Foo2.’);
}
运行第一个显然是不会有任何错误的,可是运行第二个就有问题了,这时系统会说:Microsoft JScript runtime error: Object expected。这就是说函数定义(Foo1)在脚本解析器中有最高的初始化优先级,这个很好理解。如果不优先处理函数,那么对于函数中的函数调用就没有办法处理了,假使我们先定fn1()再定义fn2(),却从fn1中调fn2,那么就通不过解析了。为什么Foo2不能被初始化,Foo2的定义根本不是函数定义,它是一个标准的赋值语句,之所以能象标准函数一样的使用Foo2(Foo2()),完全是因为它指向的是一个函数对象的实例而已。
再来看原形方法导入里的两种方式,就很简单了。并且不同的执行优先循序,也决了它们在使用中的不同,看如下示例:
<script language="javascript">
function NormalClass()
{
this.m_Property1 = ’P1 in Normal Class.’;
this.m_Property2 = ’P2 in Normal Class.’;
this.toString = function()
{
return ’[class NormalClass]’;
}
return new InnerClass();
function InnerClass()
{
this.m_Property1 = ’P1 in Inner Class.’;
this.m_Property2 = ’P2 in Inner Class.’;
this.toString = function()
{
return ’[class InnerClass]’;
}
}
InnerClass.prototype.Method1 = function()
{
alert(this.m_Property1);
};
function InnerClass.prototype.Method2()
{
alert(this.m_Property2);
};
}
</script>
执行:
var nc = new NormalClass();
nc.Method1();
nc.Method2();
是什么效果?为什么?
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/7951.htm
分享到:
评论

相关推荐

    JS类定义原型方法的两种实现的区别评论很多

    JS类定义原型方法的两种实现的区别评论很多

    JavaScript中定义对象原型的两种使用方法

    本文主要对JavaScript中定义对象原型的两种使用方法进行介绍,具有很好的参考价值,下面就跟小编一起来看下吧

    Javascript中类式继承和原型式继承的实现方法和区别之处

    其它的面向对象程序设计语言都是通过关键字来解决继承的问题。但是javascript中并没有定义这种实现的机制。接下来通过本文给大家介绍Javascript中类式继承和原型式继承的实现方法和区别,需要的朋友可以参考下

    【JavaScript源代码】配置vue全局方法的两种方式实例.docx

    配置vue全局方法的两种方式实例  目录 1,前言 2,第一种方式 3,第二种方式 总结 1,前言  2,第一种方式  3,第二种方式  总结 1,前言  在Vue项目开发中,肯定会有这样一个场景:在不同的组件页面用到...

    原型方法的不同写法居然会影响调试的解决方法

    上次我写过一篇文章,讨论”JavaScript类定义原型方法的两种实现的区别”。研究后发现除了方法的初始化方式不同外,没有发现别的原则上的却别,也就是说用哪种方式都一样。可是后来发现在VS.NET中给原型方法设置断点...

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

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

    JavaScript原型继承和原型链原理详解

    在讨论原型继承之前,先回顾一下关于创建自定义类型的方式,这里推荐将构造函数和原型模式组合使用,通过构造函数来定义实例自己的属性,再通过原型来定义公共的方法和属性。 这样一来,每个实例都有自己的实例属性...

    Javascript中实现trim()函数的两种方法

    在JavaScript中我们需要用到trim的地方很多,但是JavaScript又没有独立的trim函数或者方法可以使用,所以我们需要自己写个trim函数来实现我们的目的。 方案一: 以原型方式调用,即obj.trim()形式,此方式简单且使用...

    mixjs:基于原型的 OOP 库

    定义模块有两种方式。 在Mixjs#module的第一个参数中定义module方法。返回值将是一个 mix.js 对象。当您为局部变量定义模块时使用此方法,因为您将返回值分配给变量。 #####模块定义方法一 Mixjs.module("Iphone...

    javascript学习笔记.docx

    当类的这两个方法实现不一致时,在要进行类型转换时指定具体的实现方法比较安全。 4) 在比较运算中,若一个对象或值被转换成NaN(Not a Number),则永远返回false。 5) in可以检查指定字符串是否是一个对象的基本...

    javascript 混合的构造函数和原型方式,动态原型方式

    JS编程中最常用两种对象类定义的方式。不管是利用下面2种方式的那一种,都可以达到相同的效果!

    covenance:JavaScript中的抽象基类和契约类

    约 JavaScript中的抽象基类和契约类。 在开发,经过测试,由构建,通过分发。概念盟约Covenant是有效对象属性的规范。 它由两个只读属性定义: attribute和validator 。 它们分别是属性名称和属性验证器。 当且仅当...

    JavaScript寄生组合式继承实例详解

    首先,在js中,给对象定义属性有两种方式: //通过执行构造函数设置属性 function A(){ this.a = 1; } //通过原型设置属性 A.prototype.b = 1; 所以: 一个类Sub要继承另一个类Super,需要继承父类的prototype下的...

    javascript 写类方式之三

    取前面两种的优点: a、用构造函数来定义类属性(字段) b、用原型方式来定义类的方法。 就有了第三种方式。这种方式貌似采用的人较多。 3、综合构造函数/原型 代码如下: /** * Person类:定义一个人,有个属性name...

    深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)

    许多OO语言都支持两种继承方式:接口继承和实现继承。 接口继承只继承方法签名,而实现继承则继承实际的方法。 如其所述,由于函数没有签名,在ECMAScript中无法实现接口继承。 ECMAScript只支持实现继承,而且其...

    JavaScript组合设计模式–改进引入案例分析

     (1)组合模式中把对象分为两种(组合对象,和叶子对象)  (2)组合对象和叶子对象实现:同一批操作  (3)对组合对象执行的操作可以向下传递到叶子节点进行操作  (4)这样就会弱化类与类之间的耦合  (5)他...

Global site tag (gtag.js) - Google Analytics