Javascript确实是很烦人, 但也很诱人
这次记录constructor, 与之相关的, 还有typeof, ==, ===
试测测以下代码的结果
function demo(){
var str1="abc";
var str2=new String("abc");
var str3=new Array("abc");
alert(typeof str1);
alert(typeof str2);
alert(typeof str3);
alert(str1.constructor);
alert(str2.constructor);
alert(str3.constructor);
alert(str1 instanceof String);
alert(str2 instanceof String);
alert(str3 instanceof Array);
alert(str1==str2);
alert(str1==str3);
alert(str2==str3);
alert(str1===str2);
alert(str1===str3);
alert(str2===str3);
}
结果为
string
object
object
function String(){...}
function String(){...}
function Array(){...}
false //*1, string比较麻烦
true
true
true
true
false //*2, 2个实例进行==运算, 肯定false, 哪怕重写prototype valueOf()和toString()
false
false
false
*1, string在JS里很麻烦, 介于基本类型和对象之间, typeof "abc" -> string
"abc".constructor也是function String(){...}
但, "abc" instanceof String 却又是false, 在没有进一步了解之前, 权当是历史遗留问题吧
*2, ==运行, 对象跟string(非String)时, 会先调用对象的valueOf取值, 如果没有valueOf, 则调用toString, 然后跟string对比, 但Date对象是先toString, 然后才是valueOf
实例验证
function demo(){
var A=function(n){
this.name=n;
}
A.prototype.valueOf=function(){return this.name;}
A.prototype.toString=function(){return "A: "+this.name;}
var B=function(n){
this.name=n;
}
B.prototype.valueOf=function(){return this.name;}
B.prototype.toString=function(){return "B: "+this.name;}
var c="david";
var a=new A("david");
var b=new B(c);
alert(c==a);
alert(c==b);
alert(a==b);
}
结果:
true
true
false
看见上面的结果了吧, 有够烦人的
下面还有, 但好理解一点, 关于继承的
function demo(){
var A=function(name){
this.name=name;
}
A.prototype.showName=function(){alert(this.name);} //the function return this, "this" is the pointer of instance
A.prototype.showSex=function(){alert("male");}
A.prototype.city="shenzhen";
var B=function(name, age){
A.call(this, name);
this.age=age;
}
B.prototype=A.prototype;
B.prototype.showAge=function(){alert(this.age);}
var b=new B("david", 31);
try {
alert(b.constructor); //*1
alert(b.constructor==A); //*2
alert(b.constructor==B); //*3
alert(b instanceof A); //*4
alert(b instanceof B); //*5
} catch (exception) {
alert(exception);
}
}
结果是
1:function A{this.name=name;}
2:true
3:false //构造器指针指向A
4:true
5:true
分享到:
相关推荐
在“Java反射备忘录”中,我们可能探讨了以下核心概念: 1. 反射机制的基本概念:Java反射提供了一种在运行时分析类和对象的能力,使得程序能够动态地创建对象、调用方法、访问和修改字段值,即使这些信息在编译时...
JavaScript constructor 属性在类型检查中的应用 在 JavaScript 中,constructor 属性是一种非常有用的工具,可以帮助我们检查变量的类型。Constructor 属性可以帮助我们解决 typeof 函数无法解决的问题,即无法...
在JavaScript(JS)编程语言中,确定变量或对象的类型是一项基本且重要的任务。这不仅有助于理解代码的行为,还能在调试、数据验证以及实现特定功能时提供帮助。本文将深入探讨四种常用的方法来识别和判断JavaScript...
在JavaScript编程语言中,constructor()方法是一个非常重要的概念,它属于对象的一个属性,用于指明创建该对象的构造函数。对初学者来说,理解constructor()方法是学习JavaScript对象和原型链的基础。 首先,...
JavaScript是一种广泛应用于网络开发的高级编程语言,尤其在构建交互式网页和动态网站时不可或缺。JavaScript的核心在于其面向对象的特性,其中构造函数是理解这一特性的重要概念。本篇文章将深入探讨JavaScript中的...
Java 反射之 Constructor Java 反射机制中的 Constructor 类提供了关于类的单个构造方法的信息,包括对它的访问权限、Class 获取构造函数的方式等。下面将详细讲解 Constructor 类的概述、获取构造函数的方式、构造...
### JavaScript中的`new`操作与`constructor`属性详解 #### 一、`new`操作符的理解 在JavaScript中,`new`操作符被用于创建一个由构造函数定义的新实例对象。当使用`new`关键字调用一个构造函数时,会执行以下步骤...
深化浅析JavaScript中的constructor_ constructor 属性是 JavaScript 中的一种特殊属性,它返回对创建此对象的数组函数的引用。下面我们来深入浅析 JavaScript 中的 constructor。 constructor 属性是一个非标准...
在实际运行中,用户可以通过程序提供的菜单选择不同的操作,如添加新的备忘录、查看已有备忘录、查询特定日期的事件,或者进行农历与公历之间的转换。通过这种方式,用户可以方便地管理和记录他们的日常事务。
例如,在Chrome下调试如下程序,很清楚的展示了这点: 然而事情并不是这么简单。再看下面的代码: 很显然,这个时候obj的constructor已经不再是创建它的函数,注意... 我觉得Javascript的设计本意是让每个对象的con
JavaScript中的构造函数是用于创建特定类型对象的特殊函数。它们在对象实例化过程中起到了核心作用,使得我们可以定制对象的属性和方法。构造函数通常与`new`操作符一起使用,以便于初始化新创建的对象。 1. **构造...
Watchface-Constructor Please check [our article] (https://yalantis.com/blog/building-a-customizable-constructor-for-designers-of-android-wear-watch-face-apps) This is simple watchface constructor ...
boa-constructor是一款基于Python语言,使用wxPython库构建图形用户界面(GUI)的应用程序开发工具。它为非专业程序员提供了一种直观、易用的可视化界面来设计和编写GUI程序,降低了开发复杂度,尤其适合初学者入门...
"boa-constructor-0.6.1 for Python2.5" 是一个专为Python 2.5版本设计的集成开发环境(IDE),主要用于图形化构建应用程序的用户界面(UI)。Boa Constructor是一款开源软件,它提供了对Python程序员来说非常友好的...
在JavaScript中,`constructor`属性是一个非常重要的概念,它与对象和类的构造函数紧密相关。构造函数是一种特殊类型的函数,通常用于初始化新创建的对象。当我们谈论`constructor`时,我们指的是一个对象实例的`...
至少每个尝试JavaScriptOO的程序员都花费很多精力用在面向对象机制的模拟上而非业务本身. 这对Java,C++甚至Php的开发者来讲都是难以想象的. 更糟糕的是模拟OO对于JavaScript高级程序员都有着邪恶的吸引. 因为干这个...
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
代码如下: [removed] Function.prototype.... }[removed] 说下上面代码里面 T.constructor = this这句话,我感觉这句话没有什么实际作用, 本身T.constructor应该是为Funtion,为什么要给它设定为Funtion的实例呢,
JavaScriptConstructor,或者简称"js-konstr",是一种在JavaScript中创建对象的构造函数机制,它是面向对象编程的基础。在JavaScript中,构造函数主要用于初始化一个新创建的对象,它定义了对象的属性和方法。理解这...