原型链

函数对象都有自己的原型。

  1. function Car() { }
  2. var car = new Car();
  3. console.log(Car.prototype);//构造函数Car的原型
  4. console.log(car);
  5. //原型链 car.__proto__.__proto__

image.png

沿着proto 这个链条网上找属性的链条就是原型链

实例化对象不可以修改原型上的原始值。??? car.proto.age =13;

  1. 如果原型上的属性是原始值类型。那么实例化对象就会将原型上的属性添加到自身。并且赋值。 ```javascript /**原始值不可以修改*/

function Professor() { }

Professor.prototype.tSkill = “Java”;//将Professor原型上的tSkill 赋值为Java;

var professor = new Professor();

// professor = { // proto:{ // constructor:Professor(), // tSkill:’Java’ // }
// }

Teacher.prototype = professor;//将Teacher的原型上赋值为professor这个实例化对象; // teacher={ // mSkill:’JS/JQ’, // proto: { // proto:{ // constructor:Professor(), // tSkill:’Java’ // } // } // } function Teacher() { this.mSkill = “JS/JQ”;//如果不new或者执行。this就没有任何意义。new的情况下 mSkill 就变成了实例化对象的一个属性. } var teacher = new Teacher();//实例化Teacher这个构造函数,new之后this指向teacher

Student.prototype = teacher;//将Student的原型赋值为teacher这个实例化对象

function Student() { this.pSkill = “HTML/CSS”;//同上。 } var student = new Student();

console.log(student); //修改原始值。 student.mSkill = ‘Python’; //如果student要修改老师的mSkill,因为修改的是原始值。 //则会访问到teacher中的mSkill 给自己再添加一个相同的属性和值。

// student:{ // pSkill:’HTML/CSS’, // mSkill: ‘Python’ // proto:{ // mSkill:’JS/JQ’, // proto: { // proto:{ // constructor:Professor(), // tSkill:’Java’ // } // } // } // }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12831495/1617076080650-1c633418-82e2-4469-b86c-60280b6c7811.png#crop=0&crop=0&crop=1&crop=1&height=122&id=H7GsE&margin=%5Bobject%20Object%5D&name=image.png&originHeight=122&originWidth=354&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8097&status=done&style=none&title=&width=354)
  2. <a name="oUa1s"></a>
  3. #### 实例化对象可以修改原型上的引用值。
  4. 1. 实例化对象直接就可以修改原型上的引用值。
  5. ```javascript
  6. /********************************************引用值可以修改*****************************************************/
  7. function Professor() {
  8. }
  9. Professor.prototype.tSkill = 'Java';
  10. //在Professor 原型上添加tSkill;
  11. var professor = new Professor();
  12. //实例化professor
  13. Teacher.prototype = professor;
  14. //Teacher的原型赋值为professor
  15. function Teacher(){
  16. this.mSkill = 'JS/JQ';
  17. this.success ={
  18. 'ali':100,
  19. 'baidu':200,
  20. 'tencent':90
  21. }//success 是引用值。
  22. }
  23. var teacher = new Teacher();
  24. Student.prototype = teacher;
  25. //Student的原型赋值为teacher
  26. function Student(){
  27. this.pSkill = 'HTML/CSS';
  28. }
  29. var student = new Student();
  30. console.log('before', student);
  31. //修改之前student
  32. student.success.baidu = 100;
  33. //将student原型上的success.baidu修改为100;
  34. console.log('after', student);
  35. //修改之后student sucess.baidu 从200变成100;

this指向

  1. function Car(){
  2. this.brand = 'Benz';
  3. }
  4. Car.prototype={
  5. brand:'Mazda',
  6. intro:function(){
  7. console.log('我是'+ this.brand +'车');
  8. }
  9. }
  10. // 我是Mazda车;对象内部this就指向对象本身。
  11. Car.prototype.intro();
  12. //实例化 car
  13. var car = new Car();
  14. //我是Benz车
  15. car.intro();
  1. function Person(){
  2. this.smoke = function(){
  3. this.weight--;
  4. }
  5. }
  6. Person.prototype={
  7. weight:130
  8. }
  9. //将person 原型赋值为一个新对象
  10. var person = new Person();
  11. // 实例化一个person对象
  12. person.smoke();
  13. //此时person会从Person的原型上读取weight属性。
  14. //因为weight是原始值类型、所以把这个属性添加到自身。赋值为129
  15. console.log(person);
  16. console.log(Person.prototype);//130

对象

创建方法

  1. var obj ={};
  2. var obj = new Object();

原型也是对象,原型的原型是由系统默认的Object构造出来的

  1. function Obj() {
  2. }
  3. var obj = new Obj();
  4. //obj.__proto__===Obj.prototype true
  5. console.log(obj.__proto__);

对象的方法

Object.create

_

  1. function Obj() { };
  2. //构造函数的原型上定义一个num赋值为3。
  3. Obj.prototype.num = 3;
  4. //以Obj.prototype为原型创建了obj1 obj1的原型和
  5. var obj1 = Object.create(Obj.prototype);
  6. //实例化obj2
  7. var obj2 = new Obj();
  8. /*new 的作用。
  9. 实例化了obj2
  10. 调用构造函数Obj的初始化属性和方法。
  11. 指定实例对象的原型
  12. */
  13. //obj1的原型和obj2的原型完全相等
  14. console.log(obj1.__proto__ === obj2.__proto__); //true;
  1. var obj1 = Object.create(null);
  2. //将obj1的原型赋值为null;
  3. obj1.num = 1;
  4. //obj1添加了一个num属性。
  5. var obj2 = Object.create(obj1);
  6. //以obj1为原型创建了obj2;
  7. console.log(obj2);
  8. // {
  9. // __proto__: obj1 -> {
  10. // name: 1
  11. // }
  12. // }
  13. console.log(obj2.num);//1


toString

  1. undefined,null 不能经过包装类。所以不能继承Object 的属性和方法
  2. number有string因为有包装类 ```javascript var num = 1;

num.toString(); //由于1是没有toString 方法。所以只能先转成包装类。new Number(num)->toString()

var num2 = new Number(num);

document.write(num2); //这document.write会隐式把num2 转换成string;

  1. 3. 重写toString方法
  2. ```javascript
  3. Object.prototype.toString.call('1')
  4. "[object String]"
  5. Object.prototype.toString.call(1)
  6. "[object Number]"
  7. Object.prototype.toString.call(true)
  8. "[object Boolean]"
  9. Object.prototype.toString.call(undefined)
  10. "[object Undefined]"
  11. Object.prototype.toString.call(null)
  12. "[object Null]"
  13. Object.prototype.toString.call(function(){})
  14. "[object Function]"
  15. Object.prototype.toString.call({name:1})
  16. "[object Object]"
  17. Object.prototype.toString.call([1,2,3])
  18. "[object Array]"

call/apply更改this指向

  1. function test(){
  2. console.log(1);
  3. }
  4. test();//test.call() 调用函数时。系统隐式增加了.call;

例子

  1. //加减计算方法
  2. function Compute(){
  3. this.plus = function(a,b){
  4. console.log(a+b);
  5. },
  6. this.minus = function(a,b){
  7. console.log(a-b);
  8. }
  9. }
  10. //全部计算方法
  11. function FullCompute(){
  12. Compute.apply(this);//apply 更改了Compute 类的指向。
  13. //乘
  14. this.mul = function(){
  15. console.log(a*b);
  16. },
  17. //除
  18. this.div = function(){
  19. console.log(a/b);
  20. }
  21. }
  22. //实例化FullCompute
  23. var compute = new FullCompute();
  24. compute.plus(1,2);//3
  25. compute.minus(1,2);//-1
  26. compute.mul(1,2);//2
  27. compute.div(1,2);//0.5

demo

年龄为多少岁姓名为xx买了一辆排量为xx的什么颜色,什么牌子的汽车。

  1. //Person的构造函数。
  2. function Person(opt){
  3. Car.call(this,opt.carOpt);//这里借用了Car 修改了car的this指向。此时this指向实例化对象。
  4. this.name = opt.name;
  5. this.age = opt.age;
  6. this.speak = function(){
  7. console.log(this.name +''+this.age +'岁 '+'买了一辆排量为'
  8. +this.dispatchment
  9. +this.color+'颜色的'
  10. +this.brand+'汽车')
  11. }
  12. }
  13. //Car的构造函数
  14. function Car(opt){
  15. this.color = opt.color;
  16. this.brand = opt.brand;
  17. this.dispatchment = opt.dispatchment
  18. }
  19. //实例化Person
  20. var p = new Person({
  21. name:'张三',
  22. age:30,
  23. carOpt:{
  24. color:'red',
  25. brand:'Benz',
  26. dispatchment:'3.0T'
  27. }
  28. });
  29. console.log(p)//{name:'张三',age:30,color:'red',brand:'Benz'}
  30. p.speak();