JavaScript 原型 prototype 使用经验

function Foo(){}
Foo.prototype.sayName = function(){
    return ‘初始原型‘;
}

var foo1 = new Foo();
foo1.sayName() //‘初始原型‘
// new 方式重写原型;切断了新实例 与 原有原型之间的连接
function Bar(){}
Foo.prototype = new Bar(); //
var foo2 = new Foo();
foo2.sayName(); // error 报错;找不到这个方法

Bar.prototype.sayName = function(){
    return ‘第一次重写的原型‘;
}

var foo3 = new Foo();
foo3.sayName() // ‘第一次重写的原型‘

// 覆盖重写原型后定义的方法
Foo.prototype.sayName = function(){
    return ‘覆盖了新原型的方法‘
}

var foo4 = new Foo();
foo4.sayName() // ‘覆盖了新原型的方法‘

// 覆盖原型的方法,并不影响其他实例调用这个方法;
// 其他实例还会继续调用(覆盖前)原来的那个方法
var bar = new Bar();
bar.sayName() // ‘第一次重写的原型‘

// 对象字面量方式 重写原型对象; 切断了新实例与原有原型的连接
Foo.prototype = {
    getHeight: function(){
        return ‘高度是2m‘
    },
    getWeight: function(){
        return ‘重量是1kg‘
    }
}
// 相当于 Foo.property = new Object(); 然后再定义方法...

var foo5 = new Foo();
foo5.sayName() // error报错;找不到这个方法
// 但原有的实例 还是能连接到 原有的原型
foo4.sayName() //‘覆盖了新原型的方法‘

Foo.prototype.__proto__ == Object.prototype // true

// 另外,在构造器函数里定义的属性,比较好理解,变化没这么多

prototype 的使用经验,主要是判断 实例是在重写原型之前定义,还是重写原型之后定义的

  • 1. 重写原型会切断  原有实例 与 现有原型 的连接
  • 2. 重写原型会切断 现有实例 与 原有原型 的连接

记住一句话

  • 实例中的指针仅指向原型,而不指向构造函数

原文地址:https://www.cnblogs.com/rencoo/p/9383826.html

时间: 2024-08-05 05:44:07

JavaScript 原型 prototype 使用经验的相关文章

javascript原型Prototype

在javaScript创建对象一文中提到过:用构造函数创建对象存在一个问题即同一构造函数的不同实例的相同方法是不一样的,所以我们用原型把构造函数中公共的属性和方法提取出来进行封装,达到让所有实例共享的目的. 接下来进一步介绍javaScript原型. 一.javaScript原型机制 1.函数与原型的关系 js中创建一个函数,就会自动创建一个prototype属性,这个属性指向函数的原型对象,并且原型对象会自动获得一个constructor(构造函数)属性,指向该函数. 举例:以前面的原型模式创

深入理解javascript原型和闭包(3)——prototype原型

转载于http://www.cnblogs.com/wangfupeng1988/p/3978131.html 既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解javascript原型和闭包(1)——一切都是对象)中说道,函数也是一种对象.他也是属性的集合,你也可以对函数进行自定义属性. 不用等咱们去试验,javascript自己就先做了表率,人

理解javascript原型和作用域系列(3)——prototype原型

既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(理解javascript原型和作用域系列(1)——一切都是对象)中说道,函数也是一种对象.他也是属性的集合,你也可以对函数进行自定义属性. 不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype.对,每个函数都有一个属性叫做prototype. 这个prot

Javascript中的原型prototype

prototype属性可算是JavaScript与其他面向对象语言的一大不同之处. 简而言之,prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加属性和方法,以便在JavaScript中实现“继承”的效果. 通过以此函数作为构造函数构造出来的对象都自动的拥有构造函数的prototype对象的成员属性和方法. 其中的要点是: prototype是函数(function)的一个必备属性(书面一点的说法是"保留属性")(只要是function

[js高手之路]一步步图解javascript的原型(prototype)对象,原型链

我们接着上文继续,我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) {             this.userName = uName;         }         CreateObj.prototype.showUserName = function(){             return this.userName;         }         va

简单理解javascript的原型prototype

原型和闭包是Js语言的难点,此文主要讲原型. 每一个方法都有一个属性是 prototype 每一个对象都有一个属性是 _proto_ 一旦定义了原型属性或原型方法,则所有通过该构造函数实例化出来的所有对象,都继承了这些原型属性和原型方法,这是通过内部的_proto_链来实现的. /* Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型.这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型. 每一个方法都有一个属性叫

戏说javascript原型(prototype)实现面向对象

原型prototype JS中的方法分为三类:类方法,对象方法,原型方法 比如:一个类(Function,为对比java,以下统称为类) function Parent(name){ this.name=name; this.sayHello=function(){ alert('Hello,'+name); } } Parent类中sayHello方法就是对象方法,类比java中的实例方法 那么我这样定义一个方法呢? Parent.run=function(){ alert('run--');

秒懂javascript的原型(prototype)对象、原型链的前世今生

在上文中我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) { this.userName = uName; } CreateObj.prototype.showUserName = function(){ return this.userName; } var obj1 = new CreateObj('ghostwu'); var obj2 = new CreateObj('

在 JavaScript 中 prototype 和 __proto__ 有什么区别

本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的地方,就是 prototype 和 __proto__ 到底是干嘛的 1. __proto__ 就是 Javascript中 所谓的原型 (这里,我们还是拿具体的例子来说明吧) function A (name) { // 这里是一个构造函数 thia.name = name } var Aobj