• 对JavaScript中的静态属性和原型属性的理解


    首先是在访问上的区别,当访问实例对象的某个属性但它本身没有时,它就会到原型中去查找,但不会去查找静态属性。

    // 实例对象不会去查找静态属性
    function Foo(){}
    Foo.a = 1;
    var foo = new Foo();
    foo.a // undefined
    
    // 当实例对象没有某个属性时,会尝试去原型中查找
    function Foo(){}
    Foo.prototype.a = 1;
    var foo = new Foo();
    foo.a // 1
    

    静态方法中的this指向调用它的对象,比如在下面代码中指向的就是调用它的Foo,原型方法中的this指向实例对象

    function Foo(){}
    Foo.fn = function(){
    	console.log(this);
    };
    Foo.prototype.fn = function(){
    	console.log(this);
    };
    var foo = new Foo();
    foo.fn(); // Foo {}
    Foo.fn(); // function Foo(){}
    

    静态属性和原型属性的区别就在于this的指向以及查找规则上,但this的指向问题并不是最重要的,拿实现链式调用来说

    // 通过原型实现链式调用
    function Foo(){}
    Foo.prototype.a = function(){
    	console.log('a');
    	return this;
    };
    Foo.prototype.b = function(){
    	console.log('b');
    	return this;
    };
    var foo = new Foo();
    foo.a().b(); // a b
    
    // 通过静态方法实现链式调用
    function Foo(){}
    Foo.a = function(){
    	console.log('a');
    	return this;
    };
    Foo.b = function(){
    	console.log('b');
    	return this;
    };
    Foo.a().b(); // a b
    

    最大的区别还是在查找规则上,在原型上添加属性可以当做默认属性来使用

    function Foo(){}
    Foo.prototype.a = 1;
    var foo = new Foo(),
    	foo2 = new Foo();
    foo2.a = 2;
    foo.a // 1
    foo2.a // 2
    

    每个实例对象都可以拥有自己的属性和方法,在没有设置的情况下才会去尝试使用prototype上的属性和方法,而静态方法是无法实现这种效果的。

  • 相关阅读:
    C 语言学习 --3
    C 语言学习 --2
    C 语言学习 -1
    C 语言学习 说明
    神经网络5:循环神经网络1
    神经网络4:卷积神经网络学习 2
    神经网络3:神经网络学习 1
    神经网络2:卷积神经网络学习 1
    神经网络 1 : 卷积神经网络CNN 、 循环神经网络 RNN
    轮播swiper配置选项
  • 原文地址:https://www.cnblogs.com/pssp/p/6978617.html
Copyright © 2020-2023  润新知