原型 prototype
- 定義:原型是function對象的是一個屬性,它定義了構造函數(shù)制造出的對象的公共祖先。通過該構造函數(shù)產(chǎn)生的對象,可以繼承該原型的屬性和方法。原型也是對象。
構造函數(shù)的區(qū)別:命名大駝峰式
function Person() {
//代碼
}
var person = new Person(); //構造函數(shù)產(chǎn)生一個對象
//構造函數(shù)多次調(diào)用,可產(chǎn)生多個相似且獨立的對象。
var person1 = new Person();
···
- 利用原型的特點和概念,可以提取共有屬性。
//構造函數(shù)
function Person(name, age) {
this.name = name;
this.age = age;
}
// 提取原型中相同的屬性和方法。
Person.prototype = {
height : 180,
weight : 200,
say : function() {
console.log("abcd")
}
}
// 調(diào)用構造函數(shù)
var person1 = new Person("abc", 18);
var person2 = new Person("cba", 28);
- 對象如何查看原型
隱式屬性__proto__
每一個對象都有一個隱式的屬性,__proto__,且__proto__都指向?qū)ο蟮脑?code>prototype

Chrome控制臺
__proto__是可修改的,可修改對象指向的原型
function Person() {
}
var obj = {
name: "abc"
}
var person = new Person(); //
person.__proto__ = obj; //修改person方法原型指向
console.log(person.name) //abc
- 對象如何查看對象的構造函數(shù)
constructor
function Person() {
}
function Car() {
}
var car = new Car();
car.constructor = Person()
原型鏈
增、刪、改、查
子孫無法修改父級原型的屬性
Grandpa.prototype.lastName = "Tim";
function Grandpa() {
}
var grandpa = new Grandpa();
Father.prototype = grandpa;
function Father() {
}
var father = new Father();
Son.prototype = father;
function Son() {
}
var son = new Son();
原型鏈的最頂端指向Object.prototype
call/apply
改變this指向
相同點:
call(),apply()的第一個參數(shù)都是改變this指向。
不同點:
call() 需要把實參按照形參的個數(shù)傳進去。
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = new Person("Tim",20);
function Student() {
Person.call(this, "Tom",10)
}
var student = new Student()
apply() 需要傳一個arguments數(shù)組
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = new Person("Tim",20);
function Student() {
Person.apply(this, ["Tom",10])
}
var student = new Student()
JavaScript可正常計算范圍,小數(shù)點前16位,后16位。