面向对象的js

var a; // same as :  var a=undefined;

变量提升(hoisting):

var a=123;


function f(){

    alert(a);//undefined

    var a=1;

    alert(a);// 1

}

f();

因为函数作用域始终优先于全局作用域,所以局部变量a会覆盖掉所有与它同名的全局变量。

当JavaScript执行过程进入新的函数时,这个函数内被声明的所有变量都会被移动到函数最开始的地方,

但是被提升的只有变量的声明,而与之相关的赋值操作并不会被提升,还在原来的位置。而声明后未被赋值的变量

都被默认赋值为undefined。所以第一次alert()结果为undefined。

var f=function(){

    return 1;    

}

这种定义方式通常称为函数表示记法(function literal notation)

闭包:

N():升级作用域后保留原来对F()作用域的访问权限

构造器函数:

function Hero (name){

   this.name=name;

   this.occupation='Nanja';

   this.whoAreYou=function(){

        return "I'm"+this.name+" and I'm a "+this.occupation;

    } ;

}

利用构造器创建对象:

var h1= new Hero('Michelangelo');

h1.whoAreYou();

//若在创建对象时不加 new ,则typeof h1 结果为undefined。由于我们在Hero中使用了this,this指向全局对象。

全局对象:

程序所在的宿主环境一般都会为其提供一个全局对象,而所谓的全局变量其实都只不过是该对象的属性。

当宿主环境为web时,全局对象就是window。

若函数没有返回值,则默认返回this

function C(){

    this.a = 1;

    //return this;

}


请问this值指向的是全局对象还是对象o?

function F(){

  function C(){

    console.log(this);

    return this;

  }

  return C();

}

var o=new F();

// this指向全局对象

Object.hasOwnProperty():检测一个属性是自身属性还是原型属性,返回值为boolean类型。

获得对象中所有属性列表:

for-in循环:

var parmas={

productid:777,

section:’products’

};

var query;

for(var i in params){

query.push(i);

console.log(query);

通过对象的propertyIsEnumerable()方法来判断一个属性是否可枚举。

原型prototype是构造器所有,作为该构造器创建的对象的原型:

parent.isPrototypeOf(child)=》 true;

构造器constructor属性是对象的构造器

child.constructor==parent  =>true

child instanceof  parent  => true


obj.getPrototypeOf() :获取对象原型


__proto__: 这东西与prototype并不等价 它时某个实例的属性,而prototype是构造器函数的属性。尽量不在实际脚本中使用,因为IE等浏览器不兼容这个属性,无法实现跨平台应用。

利用prototype扩展内建对象

String.prototype.reverse=function(){

  return Array.prototype.reverse.apply(

  this.split('')).join('');

};

var str='1234';

console.log(str.reverse());

->’4321’

//该技术最常见的应用为让老式浏览器支持已被EMACScript委员会标准化了的,为现代浏览器所实现的新功能。通常把这类扩展叫做shims后polyfills

//若该技术应用不谨慎,则会导致js版本更新后命名冲突等问题,所以要慎重!


当扩展原型时应该检查方法是否存在:

向原型中添加trim()方法:



当重写某些对象的prototype时,需要重置相关的constructor属性:

function Dog(){}

Dog.prototype={};

new Dog().constructor===Dog;//false

Dog.prototype.constructor=Dog;

new Dog().constructor===Dog;//true


sort(sortby):若不传入sortby函数,则默认按照字母顺序(字符编码顺序)排序。

封装后的继承函数:

function extend(Child,Parent){

  var F=function(){};

  F.prototype=Parent.prototype;

  Child.prototype=new F();

  Child.prototype.constructor=Child;

  Child.uber=Parent.prototype;

}

function Shape(){

  this.name='shape';

}

Shape.prototype.size='100';

function Demo(){

  this.name='demo';

}

extend(Demo,Shape);

var xxy=new Demo();


精确延时:requestAnimationFrame()



你可能感兴趣的:(面向对象的js)