javascript基础一

实例对象存在constructor指针指向构造函数;

prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;

prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;
实例对象存在constructor指针指向构造函数;

prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
this.name = name;
this.age = age;> 闭包: p199 嵌套函数不会将作用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照, 一个函数内的多个闭包将共享这个函数的局部变量;

一.语言简介

  • 基于对象与事件驱动的相对安全的客户端脚本语言;

  • 特点: 弱类型, 继承基于原型, 对象的属性名映射为任意属性名;

  • javascript: 核心ECMAScript, 文档对象模型DOM, 浏览器对象模型BOM;
  • ECMAScript: 定义语法, 关键字, 保留字, 对象.., 3/5版本;
  • DOM:
  • BOM: browser object model, 可以控制浏览器页面以外的显示;

  • 引用了外部的.js文件, 则之间不能加代码

  • undefined, null 都是空的,所以==时真, undefined是undefine类型, null是object类型, 指空对象;
  • 0/0 => NaN, 12/0 => Infinity
  • isNaN: 对象处理: 如果valueof不能返回数据则调用toString, 如果toString函数返回数字则是true;

二, 函数

  • 函数没有重载功能, 调用的是最近定义的函数;

三, 对象

  • new创建: new object()
  • object()

  • 字面量创建{“A”: 14}

四. function

  • argument.callee 在函数内部调用自身
  • this指的是调用函数的对象
  • window是js下的全局对象: var a = 10; this.a ===window.a;
  • apply, call , call与apply只是传递参数不同其它一样:
var nb = 10;
function sum(n1,n2){
   return n1+n2+nb;
}
function use(n1,n2){
     // this 指执行的对象,这里是window
     return sum.apply(this,[ni,n2])
     // 或 return sum.apply(this,arguments)
     // 或 return sum.apply(this,n1,n2)
}

// apply, call主要用于实现函数执行域的替换
var box = {
     nb = 10
}
sum.apply(box,1,2) // => 1 + 2 + 123

四. 基本类型

  • 基本类型无法给自己创建新的属性和方法,但可以调用系统内置的方法;

  • 而通过new 出来的基本类型是可以添加自定义的属性和方法, 如var s = new String(“hebinbin”); s.name=”he”;

五. 面向对象

  • 构造函数没有new object,也没有return obj, 但调用时采用了new运算后则能够在隐匿完成这些过程;

  • 构造函数无需返回值, 但即使有返回值也不会影响到new运行符的使用结果 (返回值无影响);

  • 构造函数是引用类型, 两个同样的对象的实例的函数不一样 (地址不同), 这也可以认为防止一个实例的函数改变不会影响另一个实例的函数; (函数是对象, 每次实例化时生成的函数自然不会一样)

六. 原型

  • 构造函数里的属性是实例属性;
  • prototype添加的属性是原型属性, 方法;

  • 实例属性与实例方法的区别就是:共享, 原型属性是所有实例对象共享的;

  • 实例对象自动根据prototype生成指针指向共享的proto对象, (IE不支持);

  • 实例对象存在constructor指针指向构造函数;

  • prototype不能直接通过对象实例访问, 可以通过构造函数名来获得: Box.prototype;
function Box(name,age){
    this.name = name;
    this.age = age;
}
Box.prototype = {constructor:Box}  
// 通过对象字面量构造的prototype如果不自己定义constructor对象指向Box的话,b1.constructor则只是object类型, 所以这里需要手动加上;
Box.prototype.run = function() {
    return "hello"
};

var b1 = new Box("a",1);
alert(b1.constructor);

七. 继承

  • 原型链继承

  • 对象冒充只能继承构造里的信息,不会继承原型里的信息;

  • 组合继承

function Box(name){
     this.name = name
}
Box.prototype.run = function(){
     return this.name + "hello"
}

function Drive(name){
     Box.call(this,name)
}
// 上面的Drive构造函数生成的对象是无法使用到Box的prototype对象里的数据, 所以需要加上下面的语句:
Drive.prototype = new Box()

var d = new Drive("he")
alert(d.run());

如例子为nodejs中继承EventEmitter类, 使用事件监听:

var util = require('util')
var events = require('events')
function MyE(){
    this.count = 0;
    events.EventEmitter.call(this);
}

util.inherits(MyE, events.EventEmitter);

// define a method
MyE.prototype.ping = function(){
    var self = this;
    setInterval(function(){
        ++self.count;
        console.log('ping' + self.count);
        self.emit('data')
    }, 1000);
};

var ee = new MyE();

ee.on('data',function(){
    ++this.count;
    console.log('pong' + this.count);
})

ee.ping();
  • 原型式继承
function obj(o){
     function F(){}
     F.prototype = o
     return new F()
}

八. 闭包与私有成员

  • 闭包变量解除引用: b = null

  • 闭包运行的时候this指向的是window:

var user = "win";
var Box = {
    user:"box",
    run:function () {
        return function () {
            return this.user
        }
    }
};

alert(Box.run()());  // win
alert(Box.run().call(Box))  // box
  • 私有作用域: (var …; function(){…})();

  • 闭包封装数据, 函数达到私有数据的效果;

function test(){
     for (var i = 0; i < 5; ++i){
          ...
     }
     alert(i);
}

// 私有作用域: 通过自我执行函数包装
function test(){
     (function(){
          for (var i = 0; i < 5; ++i){
               ...
          }
     })();
     alert(i);   // undefined
}
  • 私有函数, 属性
function test(){
     var privar = "11"  // 私有
     function run(){  // 私有
          ....
     }
     this.pubRun = function(){  // 公有
          run()
     }
};
  • 静态成员
(function (){
     var data = 0;   // 静态私有变量
     Box = function(value){  // 全局Box 构造函数
          data = value;  // 靜态
     }
     // 共享接口
     Box.prototype.getData = function(){
          return data;
     };
     Box.prototype.setData = function(v){
          data = v;
     }
})();

var b1 = new Box(10);
var b2 = new Box(20);  // 改变了静态值
alert(b1.getData());  // 20
b2.setData(30);
alert(b1.getData());  // 30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值