关于js中的原型问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于js中的原型问题相关的知识,希望对你有一定的参考价值。
比如一个方法:
function A(a)
this.a=a;
this.b=function()
alert(this.a);
和
function A(a)
this.a=a;
A.prototype.b=function()
alert(this.a);
这两者的alert(this.a)的值应该都是一样的,为什么要使用prototype,
A.prototype.b=function()
alert(this.a);
这段代码是什么意思?
1、 为了效率。
方法一,每次 new A 的时候都需要执行一次 this.b = ...
方法二, new A 的效率比方法一略高
2、 方便继承
例如我如果有一个构造函数 function B,我希望这个构造函数建立的对象也能够具备 A 中的方法。这时候方法二就可以很友好的扩展,下面是示例代码:
// 父类function A()
// 给父类中添加方法
A.pototype.showMe = function() alert('hello world');
// 子类
function B()
// 子类继承父类的方法
B.prototype = new A;
/** 下面是测试 */
// 构造对象
var b = new B;
// 测试继承的情况
b.showMe(); // 会弹出 “hello world”
总之, prototype 是为了方便扩展和继承而设置的语言特性。当然,上面的演示代码只是原理,在实际的使用中,要比上面的示例复杂一些。
参考技术A 用prototype 貌似是为了引入 派生机制...具体你查看下相关js派生类的文章.
记得上次看到过, 不过记不清是否真如此了. 参考技术B 这是初始化:
Student.prototype.say=function()
return "李四";
;
这是重新赋值;
Student.prototype=new Person();
之所以没有发现say属性,是因为在这一步Student的原型被重写了(重新赋值),写继承时建议放在构造函数顶端,且不要对prototype直接赋值
是否可以解决您的问题?追问
谢谢您的回答
关于js中的原型
我们知道无论什么时候只要创建了一个函数,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象,默认情况下所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含了一个指向prototype属性所在函数的指针。当调用构造函数创建一个新实例后,该实例内部就会包含一个[[prototype]]指针(内部属性),指向构造函数的原型对象。例如以下的代码:
function Person(){ } Person.prototype.name = "pan"; Person.prototype.age = 23; }; var person1 = new Person();
这段代码中Person构造函数、Person的原型属性以及Person的现有实例person之间的关系可以用下图来表示:
在这里,Person.prototype指向了原型对象,而Person.prototype.constructor又回指了Person。实例person1包含了一个指向Person.prototype的内部属性[[Prototype]]。
现在来看看我们上面的图是否说对了呢?
function Person(){ } Person.prototype.name = "pan"; Person.prototype.age = 23; var person1 = new Person(); console.log(Person.prototype); console.log(person1.__proto__); console.log(Person.prototype.constructor); console.log(person1.__proto__.constructor); console.log(person1.name);
我们可以看到Person.prototype与person1.__proto__都是同一个对象Person{},所以Person.prototype.constructor和person1.__proto__.constructor都是Person这个函数。又因为person1可以利用原型链向上查找到Person.prototype的属性并使用,所以person1.name的值为pan。
以上是关于关于js中的原型问题的主要内容,如果未能解决你的问题,请参考以下文章