Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit 4efd467

Browse files
author
John Messerly
committed
improve performance for template repeat over model objects with shared prototype
1 parent 957e177 commit 4efd467

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/observe.js

+13-2
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,8 @@
608608

609609
var observedSetCache = [];
610610

611+
var hasOwnProperty = Object.prototype.hasOwnProperty;
612+
611613
function newObservedSet() {
612614
var observerCount = 0;
613615
var observers = [];
@@ -619,15 +621,24 @@
619621
if (!obj)
620622
return;
621623

622-
if (obj === rootObj)
624+
var observeProto = true;
625+
if (obj === rootObj) {
623626
rootObjProps[prop] = true;
624627

628+
// If we find the property on the root object, we can skip observing
629+
// the prototype, which is expensive. This helps a common use case:
630+
// when the user has <template repeat> over items that all share a
631+
// prototype. See https://github.com/Polymer/polymer-dev/issues/101
632+
observeProto = !hasOwnProperty.call(rootObj, prop);
633+
}
634+
625635
if (objects.indexOf(obj) < 0) {
626636
objects.push(obj);
627637
Object.observe(obj, callback);
628638
}
629639

630-
observe(Object.getPrototypeOf(obj), prop);
640+
if (observeProto)
641+
observe(Object.getPrototypeOf(obj), prop);
631642
}
632643

633644
function allRootObjNonObservedProps(recs) {

0 commit comments

Comments
 (0)