classjs的理解,js class语法

本文目录一览:

js中如何定义class,如何扩展prototype?

js没有class的概念,可以模拟对象.function MyObject() {}上面就是一个对象,你也可以理解为一个ClassMyObject.prototype.show = function () { alert(); }为原型扩展一个叫做show的方法new MyObject().show();调用这个方法.

html 中 id 和 class js

你说的是id的唯一性吧,即一个div只会有一个id来定义其样式;相对于class而言,一个div可以有多个class来定义其样式。

你的两种写法都是正确的,你的第一种写法毋庸置疑是对的,第二种是两个div同时使用一种样式一个id(而不是一个div用多个id),所以也是对的。

看来你是初学者,有问题我很乐意帮你。

如何理解Javascript中类和对象这两个概念

在说这个话题之前,我想先说几句题外话:最近偶然碰到有朋友问我“hoisting”的问题。即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的。可以看看这个例子:

var a = ‘global’;

(function () {

alert(a);

var a = ‘local’;

})();

大家第一眼看到这个例子觉得输出结果是什么?‘global’?还是‘local’?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的。

其实很简单,看一看JavaScript运行机制就会明白。我们可以把这种现象看做“预声明”。但是如果稍微深究一下,会明白得更透彻。

这里其实涉及到对象属性绑定机制。因为所有JavaScript函数都是一个对象。在函数里声明的变量可以看做这个对象的“类似属性”。对象属性的绑定在语言里是有分“早绑定”和“晚绑定”之分的。

【早绑定】

是指在实例化对象之前定义其属性和方法。解析程序时可以提前转换为机器代码。通常的强类型语言如C++,java等,都是早绑定机制的。而JavaScript不是强类型语言。它使用的是“晚绑定”机制。

【晚绑定】

是指在程序运行前,无需检查对象类型,只要检查对象是否支持特性和方法即可。可以在绑定前对对象执行大量操作而不受任何惩罚。

上面代码出现的“预声明”现象,我们大可用“晚绑定”机制来解释。在函数的作用域中,所有变量都是“晚绑定”的。 即声明是顶级的。所以上面的代码和下面的一致:

var a = ‘global’;

(function () {

var a;

alert(a);

a = ‘local’;

})();

在alert(a)之前只对a作了声明而没有赋值。所以结果可想而知。

!– 题外话到此结束 —

RT:本文要说的是,在JavaScript里,我所知道的几种定义类和对象的方式:! — 声明:以下内容大部分来自《JavaScript高级程序设计》,只是个人叙述方式不同而已 —

【直接量方式】

使用直接量构建对象是最基础的方式,但也有很多弊端。

var Obj = new Object;

Obj.name = ‘sun’;

Obj.showName = function() {

alert(‘this.name’);

}

我们构建了一个对象Obj,它有一个属性name,一个方法showName。但是如果我们要再构建一个类似的对象呢?难道还要再重复一遍?

NO!,我们可以用一个返回特定类型对象的工厂函数来实现。就像工厂一样,流水线的输出我们要的特定类型结果。

【工厂方式】

function createObj(name) {

var tempObj = new Object;

tempObj.name = name;

tempObj.showName = function () {

alert(this.name);

};

return tempObj;

}

var obj1 = createObj(‘obj_one’);

var obj2 = createObj(‘obj_two’);

这种工厂函数很多人是不把他当做构建对象的一种形式的。一部分原因是语义:即它并不像使用了运算符new来构建的那么正规。还有一个更大的原因,是因为这个工厂每次产出一个对象都会创建一个新函数showName(),即每个对象拥有不同的版本,但实际上他们共享的是同一个函数。

有些人把showName在工厂函数外定义,然后通过属性指向该方法,可以避开这个问题:

代码

可惜的是,这种方式让showName()这个函数看起来不像对象的一个方法。

【构造函数方式】

这种方式是为了解决上面工厂函数的第一个问题,即没有new运算符的问题。可是第二个问题它依然不能解决。我们来看看。

function Obj(name) {

this.name = name;

this.showName = function () {

alert(this.name);

}

}

var obj1 = new Obj(‘obj_one’);

var obj2 = new Obj(‘obj_two’);

它的好处是不用在构造函数内新建一个对象了,因为new运算符执行的时候会自动创建一个对象,并且只有通过this才能访问这个对象。所以我们可以直接通过this来对这个对象进行赋值。而且不用再return,因为this指向默认为构造函数的返回值。

同时,用了new关键字来创建我们想要的对象是不是感觉更“正式”了。

可惜,它仍然不能解决会重复生成方法函数的问题,这个情况和工厂函数一样。

【原型方式】

这种方式对比以上方式,有个很大的优势,就是它解决了方法函数会被生成多次的问题。它利用了对象的prototype属性。我们依赖原型可以重写对象实例。

var Obj = function () {}

Obj.prototype.name = ‘me’;

Obj.prototype.showName = function () {

alert(this.name);

}

var obj1 = new Obj();

var obj2 = new Obj();

我们依赖原型对构造函数进行重写,无论是属性还是方法都是通过原型引用的方式给新建的对象,因此都只会被创建一次。可惜的是,这种方式存在两个致命的问题:

1。没办法在构建对象的时候就写入想要的属性,因为原型在构造函数作用域外边,没办法通过传递参数的方式在对象创建的时候就写入属性值。只能在对象创建完毕后对值进行重写。

2。致命问题在于当属性指向对象时,这个对象会被多个实例所共享。考虑下面的代码:

var Obj = function () {}

Obj.prototype.name = ‘me’;

Obj.prototype.flag = new Array(‘A’, ‘B’);

Obj.prototype.showName = function () {

alert(this.name);

}

var obj1 = new Obj();

var obj2 = new Obj();

obj1.flag.push(‘C’);

alert(obj1.flag); // A,B,C

alert(obj2.flag); //A,B,C

是的,当flag属性指向对象时,那么实例obj1和obj2都共享它,哪怕我们仅仅改变了obj1的flag属性,但是它的改变在实例obj2中任然可见。

面对这个问题,让我们不得不想是否应该把【构造函数方式】和【原型方式】结合起来,让他们互补。。。

【构造函数和原型混合方式】

我们让属性用构造函数方式创建,方法用原型方式创建即可:

var Obj = function (name) {

this.name = name;

this.flag = new Array(‘A’, ‘B’);

}

Obj.prototype = {

showName : function () {

alert(this.name);

}

}

var obj1 = new Obj();

var obj2 = new Obj();

obj1.flag.push(‘C’);

alert(obj1.flag); // A,B,C

alert(obj2.flag); //A,B

这种方式有效地结合了原型和构造函数的优势,是目前用的最多,也是副作用最少的方式。

不过,有些追求完美的家伙还不满足,因为在视觉上还没达到他们的要求,因为通过原型来创建方法的过程在视觉上还是会让人觉得它不太像实例的方法(尤其对于传统OOP语言的开发者来说。)

所以,我们可以让原型活动起来,让他也加入到构造函数里面去,好让这个构造函数在视觉上更为统一。而这一系列的过程只需用一个判断即可完成。

var Obj = function (name) {

this.name = name;

this.flag = new Array(‘A’, ‘B’);

if (typeof Obj._init == ‘undefined’) {

Obj.prototype = {

showName : function () {

alert(this.name);

}

};

Obj._init = true;

}

}

如上,用_init作为一个标志来判断是否已经给原型创建了方法。如果是那么就不再执行。这样其实在本质上是没有任何变化的,方法仍是通过原型创建,唯一的区别在于这个构造函数看起来“江山统一”了。

但是这种动态原型的方式是有问题的,《JavaScript高级程序设计》里并没有深究。创建第一个对象的时候会因为prototype在对象实例化之前没来的及建起来,是根本无法访问的。所以第一个对象是无法访问原型方法的。同时这种方式在子类继承中也会有问题。

关于解决方案,我会在下一文中说明。

其实就使用方便来说的话,个人觉得是没必要做这个判断的。。。呵呵 ^_^

js class是方法还是对象

如果是ES6的话,CLASS是类。。。即不是方法也不是对象。。

ES6是面向对象的,所以自然就有类。。。原本的JS那套理论,是无法用来解释面向对象的。

在面向对象的概念里。。。方法和属性,都是从属于类的。。。对象是类的实例。。类是创造对象用的模板。。如果把一辆汽车比作一个对象,那类就是汽车设计图。。。

你用一个对象,可以“点”出什么属性和方法来,是由类决定的

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/279548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-20 15:04
下一篇 2024-12-20 15:04

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • Idea新建文件夹没有java class的解决方法

    如果你在Idea中新建了一个文件夹,却没有Java Class,应该如何解决呢?下面从多个方面来进行解答。 一、检查Idea设置 首先,我们应该检查Idea的设置是否正确。打开Id…

    编程 2025-04-29
  • Python Class括号中的参数用法介绍

    本文将对Python中类的括号中的参数进行详细解析,以帮助初学者熟悉和掌握类的创建以及参数设置。 一、Class的基本定义 在Python中,通过使用关键字class来定义类。类包…

    编程 2025-04-29
  • Python语法大全解析

    本文旨在全面阐述Python语法,并提供相关代码示例,帮助读者更好地理解Python语言。 一、基础语法 1、Python的注释方式 # 这是单行注释 “”” 这是多行注释,可以注…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • Python中复数的语法

    本文将从多个方面对Python中复数的语法进行详细的阐述。Python中的复数是指具有实部和虚部的数,其中实部和虚部都是浮点数。它们可以用“实数+虚数j”的形式表示。例如,3 + …

    编程 2025-04-29
  • parent.$.dialog是什么技术的语法

    parent.$.dialog是一种基于jQuery插件的弹出式对话框技术,它提供了一个方便快捷的方式来创建各种类型和样式的弹出式对话框。它是对于在网站开发中常见的弹窗、提示框等交…

    编程 2025-04-28
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27

发表回复

登录后才能评论