prototype详解

原型
参考链接:
https://segmentfault.com/a/1190000003017751

   function Person(name){
       this.name=name;
   }
   Person.prototype.sayName=function(){
       console.log(this.name);
   }
   
   var person=new Person("xl");
   
   console.log(person.constructor); //输出 function Person(){}
   console.log(Person.prototype.constructor);//输出 function Person(){}
   console.log(Person.constructor); //输出 function Function(){}
 Person.prototype={
  sayName:function(){
         console.log(this.name);
     }
 }
 
 console.log(person.constructor==Person); //输出 false (这里为什么会输出false后面会讲)
 console.log(Person.constructor==Person); //输出 false
 
 console.log(Person.prototype.constructor);// 输出 function Object(){}  
 //这里为什么会输出function Object(){}
 //还记得之前说过constructor属性始终指向创建这个对象的构造函数吗?
 
 Person.prototype={
     sayName:function(){
         console.log(this.name);
     }
 }
 //这里实际上是对原型对象的重写:
 Person.prototype=new Object(){
     sayName:function(){
         console.log(this.name);
     }
 }
 //看到了吧。现在Person.prototype.constructor属性实际上是指向Object的。
 
 //那么我如何能将constructor属性再次指向Person呢?
 Person.prototype.constructor=Person;
    function Person(name){
        this.name = name;
    }
    
    var personOne=new Person("xl");
    
    Person.prototype = {
        sayName: function(){
            console.log(this.name);
        }
    };
    
    var personTwo = new Person('XL');
    
    console.log(personOne.constructor == Person); //输出true
    console.log(personTwo.constructor == Person); //输出false   
    //大家可能会对这个地方产生疑惑?为何会第二个会输出false,personTwo不也是由Person创建的吗?这个地方应该要输出true啊?
    //这里就涉及到了JS里面的原型继承
    //这个地方是因为person实例继承了Person.prototype原型对象的所有的方法和属性,包括constructor属性。当Person.prototype的constructor发生变化的时候,相应的person实例上的constructor属性也会发生变化。所以第二个会输出false;
    //当然第一个是输出true,因为改变构造函数的prototype属性是在personOne被创建出来之后。

js对象的一般生成方法

//我们希望每个stu拥有属于自己的name和age属性
function Student(name, age) {
  this.name = name;
  this.age = age;
}

//所有的stu应该共享一个alertName()方法
Student.prototype = {
  constructor : Student,
  alertName : function() {
                alert(this.name);
              }
}

var stu1 = new Student("Jim", 20);
var stu2 = new Student("Tom", 21);

stu1.alertName();  //Jim  实例属性
stu2.alertName();  //Tom  实例属性

alert(stu1.alertName == stu2.alertName);  //true  共享函数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: prototype是JavaScript中的一个关键属性,每一个函数对象都有一个prototype属性。在JavaScript中,对象是通过构造函数创建的,而prototype属性就是用来指向该构造函数的原型对象。 原型对象是一个普通的对象,它包含了可以被实例对象共享的属性和方法。当我们创建一个实例对象时,实例对象会通过__proto__属性链接到构造函数的原型对象上,从而实现了属性和方法的继承。 通过原型对象,我们可以为实例对象添加公共的属性和方法。当实例对象需要调用某个属性或方法时,如果实例对象自身不存在这个属性或方法,它会自动在原型对象中查找。这样就实现了属性和方法的共享和复用,提高了代码的效率。 可以通过调用构造函数的prototype属性来访问原型对象,我们可以在原型对象上添加属性和方法。例如,可以通过给Array.prototype添加方法来扩展数组对象的功能,也可以给Object.prototype添加方法来扩展所有对象的功能。 需要注意的是,原型对象是共享的,当我们修改原型对象上的属性或方法时,所有的实例对象都会受到影响。因此,在修改原型对象时需要谨慎,避免对已有的对象造成不必要的影响。 总结来说,prototype属性是JavaScript中用于实现继承和共享属性的关键属性,它定义了构造函数的原型对象,使得所有通过该构造函数创建的实例对象都能够共享原型对象上的属性和方法。通过原型对象,我们可以为实例对象添加公共的属性和方法,提高代码的复用性和效率。 ### 回答2: prototype属性是JavaScript中每个对象都拥有的一个属性,它是一个指针,指向该对象的原型。原型是一个普通的对象,它包含了一些可被该对象实例共享的属性和方法。 通过使用prototype属性,我们可以为对象定义共享的属性和方法。当我们创建一个对象的实例时,该对象实例将会从其原型中继承这些共享的属性和方法。 在JavaScript中,对象的原型是通过构造函数来创建的。在创建构造函数时,会自动为该构造函数创建一个prototype属性,并将其指向一个空对象。我们可以通过向原型对象中添加属性和方法,从而为实例对象提供共享的属性和方法。 原型对象中的属性和方法,可以被该构造函数创建的所有实例对象公用。当我们访问实例对象中的属性或方法时,如果实例对象本身没有该属性或方法,就会通过原型链的查找,去原型对象中寻找。 原型属性的优势在于节省内存。因为所有实例对象共享同一个原型对象,而不是每个实例对象都拥有一份相同的属性和方法。这样就可以大大减少内存占用。 另外,通过在原型对象中定义属性和方法,还可以实现动态的属性和方法。即使在对象创建之后,我们仍然可以通过修改原型对象来为其新增属性和方法,而所有实例对象都会即刻生效。 总之,prototype属性是JavaScript中用于实现对象间继承和共享属性的重要机制,它可以让我们更高效地创建对象,并且提供了灵活的方式来定义和修改对象的共享属性和方法。 ### 回答3: prototype属性是JavaScript中的一个特殊属性,它是由每个函数创建的对象所共享的。每个构造函数都有一个prototype属性,它指向一个对象。 使用prototype属性可以给对象添加方法和属性,这些方法和属性可以被该构造函数创建的所有对象访问和共享。当我们创建一个新对象时,JavaScript会自动为该对象创建一个__proto__属性,它指向构造函数的prototype属性。 通过给prototype属性添加方法,我们可以在构造函数创建的每个对象中共享这些方法。这么做的好处是避免了在每个对象中重复创建方法的内存消耗,同时也提高了代码的可维护性。 原型继承是JavaScript的一种核心概念,它基于对象的原型链,在对象的原型链中查找属性和方法。当我们访问一个对象的属性或方法时,JavaScript会先在对象本身查找,如果找不到,就会去原型链上的原型对象中查找。这种属性和方法的继承关系使得JavaScript的对象可以“继承”来自原型对象的属性和方法。 通过使用构造函数和对象的原型链,JavaScript实现了类似于面向对象编程语言的继承概念。我们可以创建一个构造函数,通过它创建的对象会自动继承该构造函数的原型属性和方法。这样可以实现代码的复用和灵活性,减少重复的代码。 总结来说,prototype属性是通过构造函数创建的对象所共享的一个属性。通过给prototype属性添加方法和属性,可以实现这些方法和属性在所有对象中的共享。原型继承是JavaScript中实现代码复用和灵活性的一种机制,通过原型链的查找,对象可以继承来自原型对象的属性和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值