javascript小记

来源:互联网 发布:java 可变数组 编辑:程序博客网 时间:2024/06/07 12:34


本人原本的写Java的,这篇文章就用Java的“话”来记录下我javascript的学习笔记吧。

如果想看原汁原味的javascript,什么字面量呀,闭包呀,请忽略本文。

代码1

var o={    name:'我是实例',    fn:function(){        console.log('i am function in  o');    }};o.show=function(){//实例对象的方法、字段可以动态增加  console.log('i create by :%s',this.constructor);// show constructor};

上面的代码中,o是一个对象实例,它的原型是Object。从Java的角度理解,o可以看做类Object的实例。

代码2

function MyObject(){    this.name ='myObject';    this.fn=function(){        console.log('i am just a fn in funcion MyObject');    }}var myObject =new MyObject();myObject.fn();//MyObject.fn();//实例方法需要实例化后才能调用,直接调用会报错。
通过 函数来创建对象  ,创建的方法都是实例方法,不是静态方法。如果想给对象添加静态方法,可以这样:

MyObject.staticFn=function(){    console.log('i am static function in Myobject!');}MyObject.staticFn();

‘静态方法’只能通过‘类’名来调用,而不能通过实例对象来调用,否则报错。打印下就会知道了:

console.dir(MyObject);//{ [Function: MyObject] staticFn: [Function] } ‘静态方法’只在‘类’里。console.dir(myObject);//{ name: 'myObject', fn: [Function] }


代码3

var f1 = {echo: function() { console.log(("sound")); } };function Foo() {};var foo = new Foo(); // foo的基引用指向Object实例Foo.prototype = f1;/* 未定义 */console.log((foo.echo))//foo.echoe 首先查找自己,方向没有echo,于是向它的基引用查询,用构造函数//Foo()构造foo的时候,为foo创建的基引用是Object实例。所以这里显示undefinedvar foo2 = new Foo(); // foo2的基引用指f1对象foo2.echo(); // output: sound

理解基引用


JavaScript的对象是由构造函数创建的, 每个对象都有constructor属性表示创建该对象的构造函数:

复制代码
function Test() { this.a = "hello"; }
var test = new Test(); // 由Test构造函数创建
alert(test.constructor);

var o = { a: "hello" };
//实际相当于
var o_ = new Object();
o_.a 
= "hello"// 由Object构造函数创建
alert(o.constructor);
复制代码

构造函数也是对象, 那构造函数是由什么创建? 内建的Function函数:

function Test(a, b)
{
    alert(a+b)
;
}
// 相当于:
Test = new Function(["a""b"], "alert(a+b);");

Function函数又是由什么创建? 实际上Function是本机代码实现的固有对象. 不过为了一致性, Function也有constructor属性, 该属性指向它自己. 接上面的代码:

复制代码
/* 输出 function Function(){
            [native code]
        }
*/
alert(Test.constructor);

alert(Test.constructor.constructor 
=== Test.constructor); // true
alert(Test.constructor === Object.constructor); // true
复制代码


0 0