JS语法学习笔记

JS语法:


JS知识点一览图

JS知识点一览图

在function中写this,在本function中可以显示,写Person则显示undefined.
在function中写Person,在function外可以显示,写this则显示undefined.
var name;
var age;
var info;
function Person(name,age){
this.name=name;
Person.age=age;
this.info=function(){
document.writeln("name is:"+this.name+"<br/>");
document.writeln("age is:"+this.age+"<br/>");       
};      
}
var p=new Person('chen',22);
p.info();
document.writeln("w-name is:"+this.name+"<br/>");
document.writeln("w-age is:"+Person.age+"<br/>");
用call方法遍历数组:
var each=function(array,fn){    
    for(var index in array){
        fn.call(window,index,array[index]);
    }       
}
each([4,20,3],function(index,ele){
    document.write("第"+index+"个元素是:"+ele+"<br/>");
});
全局变量在函数里用this取不到,要用window调用。
    var scope="全局变量" ;

    function test(){

        document.writeln(scope+"<br/>");
        document.writeln(window.scope+"<br/>");
        var scope="局部变量";
        document.writeln(scope+"<br/>");
    }
    test();
如果定义的函数没有明确赋值给某个对象,则用window调用 。
var hello=function(name){
    document.write(name+"say:hello<br/>");      
}
window.hello("chen");
继承
function Base(){
    this.member="em";
    this.method=function(){
        window.alert(this.member);
    }   
}
function extend(){
    Base.call(this);
    window.alert(member);
    window.alert(this.method);      
}
extend();
继承进阶:输出的是Cat,执行的是Animal里的showName。
function Animal(){
    this.name='Animal';
    this.title='AnimalTitle';
    this.showName=function(){
        alert(this.name);
    }
}
function Cat(){
    this.name='Cat';
    this.showName=function(){
        alert('cat'+this.name); 
    }   
}
var animal=new Animal();
var cat=new Cat();
animal.showName.call(cat);  
cat.title='catTitle';
console.log(cat.title);
call() 和 apply()的区别:

call方法调用时,必须在括号中详细地列出每个参数,参数可以是任意类型(参数不限数量)。 apply方法调用时,可在括号中以arguments 或 数组 来代表所有参数(参数只能有两个)。

它们各自的定义:

    apply:应用某一对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

    call:调用一个对象的一个方法,以另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

  它们的共同之处:

    都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。

  它们的不同之处:

    apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。

    call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。

    实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。

prototype.constructor:

a) Prototype:每一个函数都包含一个prototype属性,这个属性指向的是一个对象的引用;而对已每一个函数(类)的实例都会从prototype属性指向的对象上继承属性,换句话说通过同一个函数创建的所有对象都继承一个相同的对象。

b) 通过new 关键字和构造函数创建的对象的原型,就是构造函数的prototype指向的那个对象

每一个函数的Prototype属性指向的对象都包含唯一一个不可枚举属性constructor,它指向了它所在的构造函数。

arguments

在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例。

innerHTML

用来获取对象的内容(还可以向对象插入内容) 这里输出的是Firstname、Lastname。

<script type="text/javascript">
function getInnerHTML(){
    alert(document.getElementById("tr1").innerHTML);        
}    
</script>
    <table border="1" id="t1">
        <tr id="tr1">
            <th>Firstname</th>
            <th>Lastname</th>
        </tr>
        <tr id="tr2">
            <td>Peter</td>
            <td>Griffin</td>
        </tr>
    </table>
    <br />
    <input type="button" onclick="getInnerHTML()"
        value="Alert innerHTML of table row" />
遍历对象的属性
function Person(name,age){
    this.name=name;
    this.age=age;
    this.info=function(){
        alert('info method');
    }   
}
var p=new Person('chen',22);
for(a in p){
    document.writeln(p[a]); 
}
prototype
function Person(name,age){
    this.name=name;
    this.age=age;
    this.info=function(){
        document.writeln(this.name);
        document.writeln(this.age);
    }   
}
var p1=new Person('chen',22);
p1.info();
Person.prototype.walk=function(){
    document.writeln(this.name+'walk...');  
}
var p2=new Person('zhi',23);
p2.info();
p2.walk();// zhiwalk... 
p1.walk();// chenwalk...

用这句话把walk方法嵌进去,这样Person类就有了walk方法,并且p1也能调用了。而且不污染代码。

Person.prototype.walk=function(){
    document.writeln(this.name+'walk...');  
}

并不是建立一个新类,是对原类进行修改。所以称为伪继承。既可以扩展自定义类,也可以扩展JS内部对象。

posted @ 2018-03-20 14:59  谈笑风生~  阅读(193)  评论(0编辑  收藏  举报