`
fastwind
  • 浏览: 319631 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

javascript的值,对象,原型

阅读更多

探讨一下,如有纰漏请指正.

首先我用了词:原型 

马上您就知道为什么这么说了.

javascript是基于对象(Object-based )的吗?不是 

javascript是面向对象(Object-Oriented )的吗?不确切 ,要清楚这句话指的是编程方法类似面向对象的编程,但是也有很多不同的地方,因此这样的说法不确切

那我们看看Mozilla官方的说法 
写道

写道
A prototype-based language, such as JavaScript, does not make this distinction: it simply has objects. A prototype-based language has the notion of a prototypical object, an object used as a template from which to get the initial properties for a new object. Any object can specify its own properties, either when you create it or at run time. In addition, any object can be associated as the prototype for another object, allowing the second object to share the first object's properties.
 


 javascript是基于原型(prototype-based )的语言.

 

那么我们在描述,研究这个语言的时候就会牵扯到这几个问题.

值和对象 :
var obj={};  
var num=9;  
var str='string'  
var arr=[];  
 

 很明显上面的几个变量都是一个对象,那变量一定是对象吗 ?
var foo;  
 

 foo是一个变量,但是foo不是对象.对象有个事实上 的特征就是,对象一定有成员 (属性或方法).

 foo就没有任何成员,他的值是undefined ,而undefined 的定义是:
写道
undefined is a property of the global object, i.e. it is a variable in global scope.
The initial value of undefined is the primitive value undefined.
 

undefined 属性是 Global 对象的一个成员,该属性在脚本引擎初始化后可用。如果已声明了一个变量但还没有初始化,那么该变量的值就是 undefined。

 也就是说undefined 是一个顶级共有属性,用关键字描述undefined 其实更确切.

 现在我们举几个值对象( javascript的其他类型的还有,就不提了) 

'isstring'.constructor;//String()  
true.constructor;//Boolean()  
9.0.constructor;//Number();这下对了吧csf178  
(9).constructor;//Number();匿名对象  
9.constructor;//SyntaxError;经csf178指正,这是浮点数转换造成的语法冲突  
[].constructor;//Array()  
{}.constructor;//fireFox :SyntaxError;IE : Object();注意javascript定义中{}是代码块和对象定义,不是Operator  
({}).constructor;//Object();匿名对象  
 
 其实值对象这个说法不是很合适.就像上面的前3个确实是值.第4个(9)其实是一个匿名的Number对象 ,

但是接下来的两句就有意思了.{}和[]竟然还有如此的区别.而且fireFox和IE实现也不同.(其实从优先级上可以找到一些答案,可惜不同实现有差异)

Object Literals中明确指出{}.xxx这种用法是错误的,所以fireFox出SyntaError是正常的.MS的jscript文档我没有看过,不知道如何解释这个.

那我们如何来评论javascript的这些特性呢?

抛弃面向对象这个说法吧,javascript真的不适合.javascript就是这样的不严格,但是很实用.

经csf178指正后,看来javascript仍旧是OO的.但是是prototype-based的OO,不是Class-based的OO.

也就是说在javascript里所有的对象都有原型,官方给出的原型

(好在我写这个帖子的时候就是为了要搞清楚这3者的关系)

总结:变量不一定指向对象 (貌似废话),对象一定有值 

原型 :

是对象一定有原型constructor 

这一点从可以从javascript的constructor的定义中找到根据.

请注意上面例子中所有的constructor都是以函数给出的,其实

原型constructor一定是一个函数形式的定义 
javascript:function fun(){};  
new fun.constructor;//anonymouse();  
(new fun).constructor;//fun();  
new fun().constructor;//fun();  
(new fun()).constructor;//fun();  
 
  

 为什么这样?其实这很正常,看看javascript运算符的优先级 就明白了.当然,你不能死照优先级来看语法的合法性,解释起来会很绕嘴的.
new Function().constructor;//Function()  
new Function.constructor;//anonymous()  
new (Function.constructor);//anonymous()  
new (Function().constructor);//anonymous()  
 
  

 这几个例子优先级就明显了.

(下面的几行是经csf178指正后,反思的结果)

回头再看看官方给出的原型里面唯独却少了最重要的Object,我们知道Object一定是个对象(javascript里没有class),Object又不在Core里,那Object是从哪里来的呢?
Object().constructor;//Object()  
Object.constructor;//Function()  
 

原来Object是由系统自Function 创建的.怎么证明呢?
alert(Object);//Object()  
delete Object;//true  
Object;//ReferenceError: Object is not defined
   

但是你不能delete Function.

Function就是一切

(反思到这里了)

因此我们讨论javascript对象的时候不要用class-based OO的概念去靠(经csf178指正),找原型 constructor 是关键

当然javascript提供了更直观的prototype 属性来实现OO方法的问题.

new这个运算符具有一定的魔术性
function fun1(){this.n=3;}  
function fun2(){this.n=3;return {};}  
var foo1=new fun1;//{n:3}  
var foo2=new fun2;//{}  
 

 也就是说原型 constructor的return值是对new有影响的.这就是new的魔术性

分享到:
评论

相关推荐

    JavaScript中的对象和原型(一)

     要了解面向对象,首先就要了解Javascript中的对象和原型。这篇文章中主要学习一下Javascript中的对象。  一 关于对象  对象其实就是一种引用类型。而对象的值就是引用类型的实例。在JavaScript 中引用类型是一...

    javascript原型和原型链

    2、所有的引用类型(数组、对象、函数)都有一个__proto__属性(隐式原型属性),属性值是一个普通的对象 console.log(array.__proto__); console.log(object.__proto__) console.log(func.__proto__) 3、所有的函数...

    深入理解JavaScript系列

    深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP 深入理解JavaScript系列(22):...

    深入理解JavaScript系列(.chm)

    深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗 》答案详解 深入理解JavaScript系列(21):S O L I D五大原则之接口隔离原则ISP 深入理解JavaScript系列(22):S...

    javascript中对象的定义、使用以及对象和原型链操作小结

    本文实例总结了javascript中对象的定义、使用以及对象和原型链操作。分享给大家供大家参考,具体如下: 1. 除了5种基本类型外,JS中剩下的就是对象 (1)对象的定义: 直接定义: var test={x:1,y:1} new方式创建...

    深入理解JavaScript系列(42):设计模式之原型模式详解

    对于原型模式,我们可以利用JavaScript特有的原型继承特性去创建对象的方式,也就是创建的一个对象作为另外一个对象的prototype属性值。原型对象本身就是有效地利用了每个构造器创建的对象,例如,如果一个构造函数...

    源文件程序天下JAVASCRIPT实例自学手册

    4.5.4 通过原型为对象添加新属性和新方法 4.5.5 自定义对象的嵌套 4.5.6 内存的分配和释放 4.6 本章小结 第5章 文档对象模型(DOM) 5.1 DOM概述 5.1.1 基本对象模型 5.1.2 Netscape Navigator浏览器扩展 5.1.3 ...

    JavaScript详解(第2版)

    1.9.1 JavaScript对象 12 1.9.2 文档对象模型 12 1.10 关于浏览器 13 1.10.1 JavaScript的版本 14 1.10.2 你的浏览器遵循标准吗 16 1.10.3 浏览器是否已启用JavaScript 16 1.11 JavaScript代码放在哪儿...

    JavaScript中对象的不同创建方法

     javascript中的对象实际上就是一个由属性组成的关联数组,属性由名称和值组成,值的类型可以是任何数据类型,或者函数和其他对象。  创建一个简单对象: var foo = {}; foo.prop_1 = 'bar'; foo.prop_2 = ...

    javascript对象的创建和访问

    JavaScript,很少能让人想到它面向对象的特性,甚至有人说它不是面向对象的语言,因为它没有...JavaScript 中的对象实际上就是一个由属性组成的关联数组,属性由名称和值组成,值的类型可以是任何数据类型,或者函数和

    浅析JavaScript原型继承的陷阱

    JavaScript默认采用原型...持有对象的变量只是一个地址,而基本类型数据是值。当原型上存储对象时,就可能有一些陷阱。 先看第一个例子 代码如下:var create = function() { function Fn() {} return function(paren

    JavaScript权威指南(第6版)中文版pdf+源代码

     3.7 不可变的原始值和可变的对象引用47  3.8 类型转换48  3.9 变量声明55  3.10 变量作用域56  第4章 表达式和运算符60  4.1 原始表达式60  4.2 对象和数组的初始化表达式61  4.3 函数定义表达式62  4.4 ...

    JavaScript权威指南(第6版)

    3.7 不可变的原始值和可变的对象引用 3.8 类型转换 3.9 变量声明 3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 ...

    JavaScript权威指南(第6版)(附源码)

    3.7 不可变的原始值和可变的对象引用 3.8 类型转换 3.9 变量声明 3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 ...

    JavaScript模式中文[pdf] 百度云

     基本值类型包装器  错误对象  小结  第4章 函数  背景  回调模式  返回函数  自定义函数  即时函数  即时对象初始化  初始化时分支  函数属性——备忘模式  配置对象  Curry  小结  第5章 对象创建...

    JavaScript — 原型链与作用域链1

    i++) {// 块级作用域}作用域每次执行都会生成一个新的活动对象作用域内的所有变量自动成为活动对象中的属性只有在作用域执行时才解析活动对象内的属性值作用域每

    SmartClone:巧妙地克隆对象,包括其即时原型,无需担心!

    深度克隆JavaScript对象(包括其直接原型),而不会无意间从全局原型中复制方法和值。 还可以在新创建的对象中复制循环关系。 安装 npm install smartclone 用法 var smartClone = require ( "smartclone" ) ; var...

    理解JAVASCRIPT中hasOwnProperty()的作用

    JavaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 hasOwnProperty()使用方法: object.hasOwnProperty(proName)其中参数object是必选项。一个对象的实例。proName是必...

    JavaScript基础和实例代码

    4.5.4 通过原型为对象添加新属性和新方法 4.5.5 自定义对象的嵌套 4.5.6 内存的分配和释放 4.6 本章小结 第5章 文档对象模型(DOM) 5.1 DOM概述 5.1.1 基本对象模型 5.1.2 Netscape Navigator浏览器扩展 5.1.3 ...

    JavaScript 权威指南(第四版).pdf

     3.7 不可变的原始值和可变的对象引用47  3.8 类型转换48  3.9 变量声明55  3.10 变量作用域56  第4章 表达式和运算符60  4.1 原始表达式60  4.2 对象和数组的初始化表达式61  4.3 函数定义表达式62  4.4 ...

Global site tag (gtag.js) - Google Analytics