Javscrpt中的原型

var ary = [12, 23, 34];
ary.slice();

执行过程:ary这个实例通过原型链的查找机制找到Array.prototype上的slice方法,让找到的slice方法执行,在执行slice方法的过程中才把ary数组进行了截取。

_proto_和prototype:

  1. _proto_:
    所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型),除了null,属性值是一个普通的对象。这个隐式原型指向构造该对象的构造函数的原型对象( proto 属性值指向它的构造函数的prototype的属性值),这也保证了实例能够访问在构造函数原型中定义的属性和方法。

原型对象:拥有prototype属性的对象,在定义函数时就被创建
在这里插入图片描述
在这里插入图片描述

  1. prototype:
    所有函数拥有prototype属性(显式原型)(仅限函数),属性值是一个普通的对象.这个属性是一个指针,指向一个对象,这个对象的用途是包含特定类型的所有实例共享的属性和方法,即这个原型对象是用来给实例共享属性和方法的。

在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数
在这里插入图片描述
在这里插入图片描述

function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age  = 28;
Person.prototype.job  = 'Software Engineer';
Person.prototype.sayName = function() {
    alert(this.name);
}  
var person1 = new Person();
person1.sayName(); // 'Zaxlct'
var person2 = new Person();
person2.sayName(); // 'Zaxlct'
console.log(person1.sayName == person2.sayName); //true
function Person(name,age){
      this.name = name;    
      this.age = age;   
      this.sayHello = function(){   
          console.log(this.name +"say hello");
     }
}
var girl = new Person("bell",22);
var boy = new Person("bella",23);    
boy.sayHello();
console.log(girl .sayHello == boy.sayHello ); //false

作用域链:
作用域是针对变量的,比如创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域:全局作用域==>函数1作用域==>函数2作用域.
作用域的特点就是,先在自己的变量范围中查找,如果找不到,就会沿着作用域往上找。

原型链:
原型链是针对构造函数的,比如先创建了一个构造函数,然后通过变量new了这个函数,那么这个被new出来的对象就会继承创建出来的那个函数的属性,然后如果访问new出来的这个对象的某个属性,但是并没有在这个new出来的对象中定义这个变量,那么它就会往上(向创建出它的函数中)查找,这个查找的过程就叫做原型链。Object ==> 构造函数1 ==> 构造函数2

猜你喜欢

转载自blog.csdn.net/wsln_123456/article/details/84999827